新聞中心
當(dāng)一個(gè)用戶上傳文件時(shí),Django 會(huì)把文件數(shù)據(jù)傳遞給 ?upload handler? —— 這是一個(gè)很小的類,它用來在上傳時(shí)處理文件數(shù)據(jù)。上傳處理模塊最初定義在 ?FILE_UPLOAD_HANDLERS ?里,默認(rèn)為:

創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括東豐網(wǎng)站建設(shè)、東豐網(wǎng)站制作、東豐網(wǎng)頁制作以及東豐網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,東豐網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到東豐省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
["django.core.files.uploadhandler.MemoryFileUploadHandler",
"django.core.files.uploadhandler.TemporaryFileUploadHandler"]? MemoryFileUploadHandler ?和 ?TemporaryFileUploadHandler ?提供 Django 默認(rèn)文件上傳行為,小文件讀入內(nèi)存,大文件存在磁盤上。
你可以編寫自定義的 ?handlers ?來自定義 Django 如何處理文件。比如,你可以使用自定義的 ?handlers ?來強(qiáng)制處理用戶層面的配額,動(dòng)態(tài)壓縮數(shù)據(jù),渲染進(jìn)度條,甚至可以將數(shù)據(jù)發(fā)送到其他存儲(chǔ)地址而不是本地。
上傳數(shù)據(jù)的存儲(chǔ)
在保存上傳的文件之前,數(shù)據(jù)需要保存到某處。
默認(rèn)情況下,如果上傳的文件小于2.5兆,Django 將把文件的所有內(nèi)容保存到內(nèi)存里。這意味著保存文件只涉及從內(nèi)存中讀取和寫入磁盤,因此這很快。
但如果上傳的文件很大,Django 會(huì)把文件寫入系統(tǒng)臨時(shí)目錄的臨時(shí)文件里存儲(chǔ)。在類 Unix 平臺(tái)里這意味著 Django 會(huì)生成一個(gè)類似名為 ?/tmp/tmpzfp6I6.upload? 的文件。如果上傳的文件非常大,你可以查看這個(gè)文件的大小增長,因?yàn)?Django 將數(shù)據(jù)流式傳輸?shù)酱疟P上。
動(dòng)態(tài)修改上傳處理程序
有時(shí)候某些視圖需要不同的上傳行為。在這些例子里,你可以基于每個(gè)請(qǐng)求覆蓋上傳處理程序。默認(rèn)情況下,這個(gè)列表將包含由 ?FILE_UPLOAD_HANDLERS ?設(shè)置的上傳處理程序,但你可以像修改其他列表一樣修改這個(gè)列表。
比如,假設(shè)你正在編寫 ?ProgressBarUploadHandler ?,來提供在上傳過程中的反饋給 ?Ajax widget?。你需要添加這個(gè)處理程序到你的上傳處理模塊:
request.upload_handlers.insert(0, ProgressBarUploadHandler(request))你或許想在這里使用 ?list.insert()? (而不是 ?append()? ),因?yàn)檫M(jìn)度條處理程序需要在其他處理程序之前使用。記住,上傳處理程序是按順序處理的。
如果你想完全替換上傳處理程序,你需要指定新列表:
request.upload_handlers = [ProgressBarUploadHandler(request)]注解
你只能在訪問 ?request.POST? 或 ?request.FILES? 之前修改上傳處理程序,開始上傳處理后修改上傳處理程序沒有意義。如果你從讀取 ?request.POST? 或 ?request.FILES? 之后嘗試修改 ?request.upload_handlers? ,Django 會(huì)報(bào)錯(cuò)。
因此,你要盡早在視圖里修改上傳處理程序。
而且, ?request.POST? 由 ?CsrfViewMiddleware ?訪問,默認(rèn)情況下已開啟。這意味著你需要在視圖上使用 ?csrf_exempt()? 來允許你改變上傳處理程序。然后你需要在實(shí)際處理請(qǐng)求的函數(shù)上使用 ?csrf_protect()? 。注意這可能會(huì)讓處理程序在 CSRF 檢測完成之前開始接受文件上傳。示例:
from django.views.decorators.csrf import csrf_exempt, csrf_protect
@csrf_exempt
def upload_file_view(request):
request.upload_handlers.insert(0, ProgressBarUploadHandler(request))
return _upload_file_view(request)
@csrf_protect
def _upload_file_view(request):
... # Process request如果你使用的是基于類的視圖,你需要在其 ?csrf_exempt()? 方法上使用 ?dispatch()?,并在實(shí)際處理請(qǐng)求的方法上使用 ?csrf_protect()?。示例代碼:
from django.utils.decorators import method_decorator
from django.views import View
from django.views.decorators.csrf import csrf_exempt, csrf_protect
@method_decorator(csrf_exempt, name='dispatch')
class UploadFileView(View):
def setup(self, request, *args, **kwargs):
request.upload_handlers.insert(0, ProgressBarUploadHandler(request))
super().setup(request, *args, **kwargs)
@method_decorator(csrf_protect)
def post(self, request, *args, **kwargs):
... # Process request 網(wǎng)站題目:創(chuàng)新互聯(lián)Django4.0教程:Django4.0文件上傳-上傳Handlers
文章鏈接:http://fisionsoft.com.cn/article/dpccddg.html


咨詢
建站咨詢
