2011-08-08 54 views
1

在視圖中創建新的文件:返回JSON文件的視圖

sys.stdout = open(backup_name, 'w') 
call_command('dumpdata') 

如何我現在這個文件返回給用戶?

我試圖將HttpResponse中的mimetype更改爲'application/json',但是如何將文件內容添加到響應?

或者也許有其他方式來返回文件?

回答

1

只需複製/鏈接/調用與模型序列化相關的dumpdata代碼,並將其直接轉儲到響應中,以避免許可問題和文件系統污染。內容處置和mimetype仍然適用。

不管怎樣,記得dumpdata 可以是一個簡單的過程,所以你暴露於超時。

1

好,我知道了:

response = HttpResponse(open(backup_path, "r"), mimetype='application/json',) 
response['Content-Disposition'] = "filename=%s" % backup_name" 

保存在光盤上的文件後,我打開它進行閱讀和響應設置文件名。

任何人有另一種想法?

0

我的最終解決方案是(感謝薩維里奧):

response = HttpResponse(mimetype='application/json',) 
response['Content-Disposition'] = "filename=%s" % backup_name 
sys.stdout = response 
call_command('dumpdata') 
2

我知道這是一個有點晚了,但我發現這是一個很好的起點,所以我想其他人可以從我發現了太多受益。

對於小文件,如果您將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') 

我發現這對甚至非常大的文件運作良好。

1

我試圖返回一個字典作爲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