利用HTML5的一個formdata屬性,結合jQuery能夠很容易實現文件的上傳,並且讀取文件的上傳進度。前端
注意:formdata屬性必須依賴於HTML5,若是按照文本代碼實現功能,則必須升級爲最新屬性(支持HTML5formdata屬性)python
爲了不頁面總體刷新,咱們還能夠採用ajax+iframe(兼容全部瀏覽器)上傳,這樣用戶上傳以後能夠當即看到文件(表單僞造)ajax
坑1.action="/upload/",當年筆者傻傻的就只寫了action="/upload",由於url是這麼配的:url(r'^upload', v.upload),結果django報錯了,雖然url的最後沒有加'/',django
可是django在運行時會自動給url的後面加'/',所以,咱們在post提交時,必須在url的最後加'/'。瀏覽器
2.enctype="multipart/form-data",文件上傳相對於其餘表單類型出現的機率比較小,而文件上傳確是這些表單類型中的異類,它須要在form寫上enctype="multipart/form-data」服務器
3.{% csrf_token %},django運行程序時,請求首先會經過中間件,而後纔會經過url,django配置文件中有關於跨站請求僞造的中間件:函數
django爲用戶實現防止跨站請求僞造的功能,經過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對於django中設置防跨站請求僞造功能有分爲全局和局部。post
全局:url
中間件 django.middleware.csrf.CsrfViewMiddlewareorm
局部:
@csrf_protect,爲當前函數強制設置防跨站請求僞造功能,即使settings中沒有設置全局中間件。
@csrf_exempt,取消當前函數防跨站請求僞造功能,即使settings中設置了全局中間件。
中間件'django.middleware.csrf.CsrfViewMiddleware',會查看post請求是否攜帶token ,若是沒有則直接在process_request中return 並報出以下錯誤:
處理方式:1.直接簡單粗暴的註釋掉settings中的csrf中間件
2.給接收post請求的views函數加@csrf_exempt(注:from django.views.decorators.csrf import csrf_exempt,csrf_protect),該裝飾器的意思是取消當前函數防跨站請求僞造功能
後臺和前端js關於文件路徑再現一坑:
注:這裏咱們將圖片保存在靜態文件目錄static下的img中(靜態文件路徑的前綴也是static)
django前端咱們但願的引入圖片的路徑是這樣的:/static/img/xx.png,這裏須要注意的是static前必須加'/',沒錯,就是這個神奇的'/',表明當前程序主目錄,即配置文件中的BASE_DIR。
後臺咱們打開文件寫入圖片到服務器的路徑,這裏open路徑須要遵循的是python的規則而不是django前端的規則,即python會默認從當前路徑開始找,所以直接static/img/xx.png就行,
前面不須要加'/'。