2009-08-05 47 views
2

在Django中,我希望在接收到任何不會以指定擴展名結尾的文件上載時立即停止。要做到這一點,我定義自定義上傳處理器和NEW_FILE寫這個樣子:Django文件上傳處理程序錯誤

def new_file(self, field_name, file_name, content_type, content_length, charset=None): 
    basename, extension = os.path.splitext(file_name) 
    if extension != ".txt": 
     raise StopUpload(True) # Error: Only .txt files are accepted 

這正常停止上傳,但它也清除request.FILES。現在,當我的視圖收到請求時,它無法確定上傳處理程序是否導致文件丟失,並且我無法向用戶顯示有用的消息。

是否有任何方法將消息從上傳處理程序傳播到相應的視圖,以便我可以向用戶顯示錯誤?我試過使用請求對象,但它是不可變的。

回答

3

我找到了一個原因,爲什麼我不能得到它的工作和解決方案 以及。

看起來,Django使用延遲評估request.FILES到 確定何時調用上傳處理程序。因此,僅當您嘗試訪問 request.FILES時,纔會調用上傳 處理程序。另外,我使用的 (WSGIRequest在我的例子中)的請求對象已經使GET和POST不可變字典 ,所以我們不能通過那裏傳遞信息。但是,META仍然可以向 添加信息。

我的組合解決方案的行「request.FILES」在 處理上傳視圖,這迫使上傳處理程序開始。當在new_files中捕獲到 錯誤時,我將self.request.META ['error']設置爲 錯誤消息,並提出StopUpload,這會將我們推回到沒有文件的 視圖。最後,我在 視圖中檢查request.META ['錯誤'],並在出現問題時顯示該消息。

我希望這有助於!

+0

仍然很好,謝謝。如果現代Django有更好的方式將這些數據傳遞給視圖,而不是請求.META,我很樂意聽到它。 – velotron 2012-12-12 18:28:33