在視圖中創建新的文件:返回JSON文件的視圖
sys.stdout = open(backup_name, 'w')
call_command('dumpdata')
如何我現在這個文件返回給用戶?
我試圖將HttpResponse中的mimetype更改爲'application/json',但是如何將文件內容添加到響應?
或者也許有其他方式來返回文件?
。
在視圖中創建新的文件:返回JSON文件的視圖
sys.stdout = open(backup_name, 'w')
call_command('dumpdata')
如何我現在這個文件返回給用戶?
我試圖將HttpResponse中的mimetype更改爲'application/json',但是如何將文件內容添加到響應?
或者也許有其他方式來返回文件?
。
只需複製/鏈接/調用與模型序列化相關的dumpdata代碼,並將其直接轉儲到響應中,以避免許可問題和文件系統污染。內容處置和mimetype仍然適用。
不管怎樣,記得dumpdata 可以是一個簡單的過程,所以你暴露於超時。
好,我知道了:
response = HttpResponse(open(backup_path, "r"), mimetype='application/json',)
response['Content-Disposition'] = "filename=%s" % backup_name"
保存在光盤上的文件後,我打開它進行閱讀和響應設置文件名。
任何人有另一種想法?
我的最終解決方案是(感謝薩維里奧):
response = HttpResponse(mimetype='application/json',)
response['Content-Disposition'] = "filename=%s" % backup_name
sys.stdout = response
call_command('dumpdata')
我知道這是一個有點晚了,但我發現這是一個很好的起點,所以我想其他人可以從我發現了太多受益。
對於小文件,如果您將JSON文件的模板文件夾,使Django能夠找到它,你可以用render_to_response
返回它:
return render_to_response(data_file,mimetype='application/json')
我覺得這是對某些大型數據集的問題瀏覽器。我會得到錯誤An existing connection was forcibly closed by the remote host
。另一種方法解決了這個問題
首先,您必須創建文件的完整路徑。使用PROJECT_ROOT變量(在settings.py中由PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
定義)。要訪問這個和os方法,您必須在views.py中使用import settings, os
。一旦你有這個文件的位置,你可以使用下面的代碼返回它:
backup_path = os.path.join(settings.PROJECT_ROOT, "templates", "json_dumps", "large_file.json")
return HttpResponse(open(backup_path, 'r'),content_type = 'application/json; charset=utf8')
我發現這對甚至非常大的文件運作良好。
我試圖返回一個字典作爲json文件。這裏是我的解決方案:
import json
import cStringIO as StringIO
from wsgiref.util import FileWrapper
from django.http import HttpResponse
data_string = json.dumps(data)
json_file = StringIO.StringIO()
json_file.write(data_string)
json_file.seek(0)
wrapper = FileWrapper(json_file)
response = HttpResponse(wrapper, content_type='application/json')
response['Content-Disposition'] = 'attachement; filename=dump.json'
return response