Django框架靜態文件處理、中間件、上傳文件操作實例詳解
本文實例講述了Django框架靜態文件處理、中間件、上傳文件操作。分享給大家供大家參考,具體如下:
Django靜態文件處理、中間件、上傳文件靜態文件處理在Django中,一般專門創建一個static目錄來存放靜態文件(css,js,image,video等文件)。
a. 在創建目錄前,我們需要配置靜態文件的路徑。如:
#在項目的settings.py文件中,配置STATIC_URL,一般默認是:STATIC_URL = ’/static/’ # ’/static/’是指uri,映射下面的static目錄。做映射可以對靜態文件起到一個保護作用,避免受到攻擊,下面介紹。STATICFILES_DIRS = [ # 指定文件目錄,BASE_DIR指的是項目目錄,static是指存放靜態文件的目錄。 os.path.join(BASE_DIR , ’static’), ]
b. 創建static目錄,如圖:
c. 例子
{% load static from staticfiles %} <!--從staticfiles中導入靜態文件--><!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>Title</title></head><body><!--使用硬編碼的方式請求圖片,如果配置中的STATIC_URL的uri改變,這種硬編碼的形式就加載不到資源--><img src='https://rkxy.com.cn/static/myapp/1.png' alt='image'/><br/><!--使用映射的方式加載圖片,可以避免uri短鏈接改變導致圖片資源加載不到的問題,要用這種方式,需要導入第一行--><img src='http://www.cgvv.com.cn/bcjs/{% static ’myapp/1.png’ %}' alt='image'/></body></html>中間件
中間件是一個輕量級、底層的插件系統,可以介入Django的請求和響應處理過程,修改Django的輸入或輸出。
a. 在Django中,中間件配置
在項目的settings.py文件中,有一個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文件中,默認是MIDDLEWARE,我們要是用中間件,需要改成MIDDLEWARE_CLASSES。
b. 每個中間件都是一個獨立的Python類,可以定義下面的方法一個或多個:
__init__:無需任何參數,服務器響應第一個請求的時候調用一次,用于確定是否用當前中間件。process_request(request):執行視圖之前被調用,在每個請求上調用,返回None或HttpResponse對象。process_view(request,view_func,view_args,view_kwargs):調用視圖之前調用,在每個請求上調用,返回None或HttpResponse對象。process_template_response(request,response):在視圖剛好執行完畢之后調用,在每個請求上調用,返回實現了render方法的響應對象。process_response(request,response):所有響應返回瀏覽器之前被調用,在每個請求上調用,返回HttpResponse對象。process_exception(request,response,exception):當視圖拋出異常時調用,在每個請求上調用,返回一個HttpResponse對象。
如圖:
使用中間件,可以干擾整個處理過程,每次請求中都會執行中間件的方法。中間件是實際上是AOP(面向切片編程)的概念。
c. 示例
# 定義一個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 requestprocess viewbaseprocess response
在瀏覽器輸入,127.0.0.1:8000/exception,輸出
process requestprocess viewmyexceptionprocess exceptionprocess response上傳圖片
a. 配置上傳圖片的路徑
在settings.py文件中,配置MEDIA_ROOT,如:
MEDIA_ROOT = BASE_URL + ’/static/media’ # 一般配置成靜態文件目錄下
在項目中,創建/static/media/目錄
b. 配置url
在項目的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個方法,分別為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 方法 錯誤’)
e. 瀏覽器操作
在瀏覽器中輸入,127.0.0.1:8000/upload/form
出現如下表單:
選擇圖片,點擊上傳,出現上傳成功,表示圖片已上傳到文件中。
希望本文所述對大家基于Django框架的Python程序設計有所幫助。
相關文章:
