Django框架靜態(tài)文件處理、中間件、上傳文件操作實(shí)例詳解
本文實(shí)例講述了Django框架靜態(tài)文件處理、中間件、上傳文件操作。分享給大家供大家參考,具體如下:
Django靜態(tài)文件處理、中間件、上傳文件
靜態(tài)文件處理
在Django中,一般專門創(chuàng)建一個(gè)static目錄來(lái)存放靜態(tài)文件(css,js,image,video等文件)。
a. 在創(chuàng)建目錄前,我們需要配置靜態(tài)文件的路徑。如:
#在項(xiàng)目的settings.py文件中,配置STATIC_URL,一般默認(rèn)是: STATIC_URL = '/static/' # '/static/'是指uri,映射下面的static目錄。做映射可以對(duì)靜態(tài)文件起到一個(gè)保護(hù)作用,避免受到攻擊,下面介紹。 STATICFILES_DIRS = [ # 指定文件目錄,BASE_DIR指的是項(xiàng)目目錄,static是指存放靜態(tài)文件的目錄。 os.path.join(BASE_DIR , 'static'), ]
b. 創(chuàng)建static目錄,如圖:
c. 例子
{% load static from staticfiles %} <!--從staticfiles中導(dǎo)入靜態(tài)文件--> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--使用硬編碼的方式請(qǐng)求圖片,如果配置中的STATIC_URL的uri改變,這種硬編碼的形式就加載不到資源--> <img src="/static/myapp/1.png" alt="image"/> <br/> <!--使用映射的方式加載圖片,可以避免uri短鏈接改變導(dǎo)致圖片資源加載不到的問(wèn)題,要用這種方式,需要導(dǎo)入第一行--> <img src="{% static 'myapp/1.png' %}" alt="image"/> </body> </html>
中間件
中間件是一個(gè)輕量級(jí)、底層的插件系統(tǒng),可以介入Django的請(qǐng)求和響應(yīng)處理過(guò)程,修改Django的輸入或輸出。
a. 在Django中,中間件配置
在項(xiàng)目的settings.py文件中,有一個(gè)MIDDLEWARE_CLASSES
的變量,里面定義的就是中間件。如:
MIDDLEWARE_CLASSES = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
在settings.py文件中,默認(rèn)是MIDDLEWARE
,我們要是用中間件,需要改成MIDDLEWARE_CLASSES
。
b. 每個(gè)中間件都是一個(gè)獨(dú)立的Python類,可以定義下面的方法一個(gè)或多個(gè):
__init__:無(wú)需任何參數(shù),服務(wù)器響應(yīng)第一個(gè)請(qǐng)求的時(shí)候調(diào)用一次,用于確定是否用當(dāng)前中間件。 process_request(request):執(zhí)行視圖之前被調(diào)用,在每個(gè)請(qǐng)求上調(diào)用,返回None或HttpResponse對(duì)象。 process_view(request,view_func,view_args,view_kwargs):調(diào)用視圖之前調(diào)用,在每個(gè)請(qǐng)求上調(diào)用,返回None或HttpResponse對(duì)象。 process_template_response(request,response):在視圖剛好執(zhí)行完畢之后調(diào)用,在每個(gè)請(qǐng)求上調(diào)用,返回實(shí)現(xiàn)了render方法的響應(yīng)對(duì)象。 process_response(request,response):所有響應(yīng)返回瀏覽器之前被調(diào)用,在每個(gè)請(qǐng)求上調(diào)用,返回HttpResponse對(duì)象。 process_exception(request,response,exception):當(dāng)視圖拋出異常時(shí)調(diào)用,在每個(gè)請(qǐng)求上調(diào)用,返回一個(gè)HttpResponse對(duì)象。
如圖:
使用中間件,可以干擾整個(gè)處理過(guò)程,每次請(qǐng)求中都會(huì)執(zhí)行中間件的方法。中間件是實(shí)際上是AOP(面向切片編程)的概念。
c. 示例
# 定義一個(gè)MyTrace類,作為中間件 class MyTrace(object): def process_request(self, request): print('process request') def process_view(self, request, views, views_args, views_kwargs): print('process view') def process_template_response(self, request, response): print('process template response') return render(request=request, template_name='base.html') def process_response(self, request, response): print('process response') return HttpResponse('process response') def process_exception(self, request, exception): print('process exception') return HttpResponse('exception')
配置中間件,將作為中間件的類天驕到配置
MIDDLEWARE_CLASSES = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'testdjango.middleware.MyTrace', # 自定義中間件 ]
配置url和定義視圖view
# 配置url,在urls.py文件中 urlpatterns = [ url(r'^base$', view.base), url(r'exception$', view.myexception), ] # 定義視圖,在view.py文件中定義 def base(request): print('base') return HttpResponse('response') def myexception(request): print('myexception') int('abc') return HttpResponse('exception')
在瀏覽器輸入,127.0.0.1:8000/base
,輸出
process request process view base process response
在瀏覽器輸入,127.0.0.1:8000/exception
,輸出
process request process view myexception process exception process response
上傳圖片
a. 配置上傳圖片的路徑
在settings.py文件中,配置MEDIA_ROOT,如:
MEDIA_ROOT = BASE_URL + '/static/media' # 一般配置成靜態(tài)文件目錄下
在項(xiàng)目中,創(chuàng)建/static/media/
目錄
b. 配置url
在項(xiàng)目的urls.py文件,配置url,如:
urlpatterns = [ url(r'upload/form/',view.form), # 上傳圖片的form表單 url(r'upload/image/',view.image), # 上傳圖片的url ]
c. 編寫模板
表單模板,upload_form.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/upload/image/" method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="image"> <br> <input type="submit" value="上傳"> </form> </body> </html>
d. 處理視圖邏輯
在view.py文件定義2個(gè)方法,分別為form()和image(),如:
def form(request): return render(request=request, template_name='update_form.html') def image(request): if request.method == 'POST': image = request.FILES['image'] imageName = os.path.join(settings.MEDIA_ROOT, image.name) print(imageName) with open(imageName, 'wb') as f: for image_part in image.chunks(): f.write(image_part) return HttpResponse('上傳成功') else: return HttpResponse('method 方法 錯(cuò)誤')
e. 瀏覽器操作
在瀏覽器中輸入,127.0.0.1:8000/upload/form
出現(xiàn)如下表單:
選擇圖片,點(diǎn)擊上傳,出現(xiàn)上傳成功,表示圖片已上傳到文件中。
希望本文所述對(duì)大家基于Django框架的Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
python函數(shù)的高級(jí)應(yīng)用詳解
這篇文章主要為大家介紹了python函數(shù)的高級(jí)應(yīng)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-11-11python 網(wǎng)絡(luò)編程詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了python 網(wǎng)絡(luò)編程詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04python3模塊smtplib實(shí)現(xiàn)發(fā)送郵件功能
這篇文章主要為大家詳細(xì)介紹了python3模塊smtplib實(shí)現(xiàn)發(fā)送郵件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05PyQt5 實(shí)現(xiàn)狀態(tài)欄永久顯示消息
這篇文章主要介紹了PyQt5 實(shí)現(xiàn)狀態(tài)欄永久顯示消息的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03調(diào)用其他python腳本文件里面的類和方法過(guò)程解析
這篇文章主要介紹了調(diào)用其他python腳本文件里面的類和方法過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11圖文詳解Python中模塊或py文件導(dǎo)入(超詳細(xì)!)
導(dǎo)入文件目的就是為了執(zhí)行文件,下面這篇文章主要給大家介紹了關(guān)于Python中模塊或py文件導(dǎo)入的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04