4

django を使用してクライアントにデータをストリーミングする方法を知りたいです。

目標

ユーザーがフォームを送信すると、フォーム データが文字列を返す Web サービスに渡されます。文字列は tarball され ( tar.gz)、tarball がユーザーに送り返されます。

道がわかりません。検索してこれを見つけましが、文字列しかなく、それが欲しいものかどうかわかりません。代わりに何を使用すればよいかわかりませfilename = __file__ん。ファイルがないため、文字列だけです. ユーザーごとに新しいファイルを作成する場合、これは良い方法ではありません。だから私を助けてください。(申し訳ありませんが、私はWebプログラミングが初めてです)。

編集:

$('#sendButton').click(function(e) {
        e.preventDefault();
        var temp = $("#mainForm").serialize();
        $.ajax({
            type: "POST",
            data: temp,
            url: 'main/',
            success: function(data) {                
                $("#mainDiv").html(data.form);
                ????                

            }
        });
    });

ajaxを使いたいのですが、ajac関数の成功とビューの戻りはどうすればいいですか。本当にありがとう。

私のview.py:

def idsBackup(request):
    if request.is_ajax():        
        if request.method == 'POST':
           result = ""
           form = mainForm(request.POST)
           if form.is_valid():
               form = mainForm(request.POST)
               //do form processing and call web service               

                    string_to_return = webserviceString._result 
                    ???
           to_json = {}
           to_json['form'] = render_to_string('main.html', {'form': form}, context_instance=RequestContext(request))
           to_json['result'] = result
           ???return HttpResponse(json.dumps(to_json), mimetype='application/json')
        else:
            form = mainForm()
        return render_to_response('main.html', RequestContext(request, {'form':form}))
    else:
        return render_to_response("ajax.html", {}, context_instance=RequestContext(request))
4

2 に答える 2

8

実際のファイルの代わりに文字列 content を使用してContentFileの django ファイル インスタンスを作成し、それを応答として送信できます。

サンプルコード:

from django.core.files.base import ContentFile
def your_view(request):
    #your view code
    string_to_return = get_the_string() # get the string you want to return.
    file_to_send = ContentFile(string_to_return)
    response     = HttpResponse(file_to_send,'application/x-gzip')
    response['Content-Length']      = file_to_send.size    
    response['Content-Disposition'] = 'attachment; filename="somefile.tar.gz"'
    return response   
于 2012-12-01T06:26:46.770 に答える
1

必要に応じて、スニペットの send_zipfile を変更できます。StringIO を使用して、文字列をファイルのようなオブジェクトに変換し、FileWrapper に渡すことができます。

import StringIO, tempfile, zipfile
...
# get your string from the webservice
string = webservice.get_response() 
...
temp = tempfile.TemporaryFile()

# this creates a zip, not a tarball
archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)

# this converts your string into a filelike object
fstring = StringIO.StringIO(string)   

# writes the "file" to the zip archive
archive.write(fstring)
archive.close()

wrapper = FileWrapper(temp)
response = HttpResponse(wrapper, content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename=test.zip'
response['Content-Length'] = temp.tell()
temp.seek(0)
return response
于 2012-12-01T06:28:26.817 に答える