3

Djangoファイルのアップロードの進行状況プロセスjsonリクエストがnull応答を取得

view.py

def upload_progress(request):
    """
    A view to report back on upload progress.
    Return JSON object with information about the progress of an upload.

    Copied from:
    http://djangosnippets.org/snippets/678/

    See upload.py for file upload handler.
    """
    #import ipdb
    #ipdb.set_trace()
    progress_id = ''
    if 'X-Progress-ID' in request.GET:
        progress_id = request.GET['X-Progress-ID']
    elif 'X-Progress-ID' in request.META:
        progress_id = request.META['X-Progress-ID']
    if progress_id:
        from django.utils import simplejson
        cache_key = "%s_%s" % (request.META['REMOTE_ADDR'], progress_id)
        data = cache.get(cache_key)


        return HttpResponse(simplejson.dumps(data))

UploadProgressCachedHandler.py

    from django.core.files.uploadhandler import FileUploadHandler
    from django.core.cache import cache

    class UploadProgressCachedHandler(FileUploadHandler):
        """
        Tracks progress for file uploads.
        The http post request must contain a header or query parameter, 'X-Progress-ID'
        which should contain a unique string to identify the upload to be tracked.

        Copied from:
        http://djangosnippets.org/snippets/678/

        See views.py for upload_progress function...
        """

        def __init__(self, request=None):
            super(UploadProgressCachedHandler, self).__init__(request)
            self.progress_id = None
            self.cache_key = None

        def handle_raw_input(self, input_data, META, content_length, boundary, encoding=None):
            self.content_length = content_length
            if 'X-Progress-ID' in self.request.GET :
                self.progress_id = self.request.GET['X-Progress-ID']
            elif 'X-Progress-ID' in self.request.META:
                self.progress_id = self.request.META['X-Progress-ID']
            if self.progress_id:
                self.cache_key = "%s_%s" % (self.request.META['REMOTE_ADDR'], self.progress_id )
                cache.set(self.cache_key, {
                    'length': self.content_length,
                    'uploaded' : 0
                })

        def new_file(self, field_name, file_name, content_type, content_length, charset=None):
            pass

        def receive_data_chunk(self, raw_data, start):
            if self.cache_key:
                data = cache.get(self.cache_key)
                data['uploaded'] += self.chunk_size
                cache.set(self.cache_key, data)
                #cache.set(self.cache_key, 5000)
            return raw_data

        def file_complete(self, file_size):
            pass

        def upload_complete(self):
            if self.cache_key:
                cache.delete(self.cache_key)

UploadProgressCacheHandlerを使用してキャッシュを設定しています。しかし、jsonリクエストを介して取得しようとすると、data返さNoneれるオブジェクト「cache_key」が正しく生成されます。

助けてください。

4

1 に答える 1

2

フローがすでに に達しているときに JSON リクエストを作成しようとしていると思いますupload_complete。その時点でcache_key、キャッシュから削除されています (そのため空です)。

Django 開発サーバーを使用していますか? この組み込みサーバーでは、一度に 1 つのリクエストしか処理できないと思います。これは、あなたの状況では、最初にアップロードが完了し、JSON リクエストに続いて処理されることを意味します。複数のリクエストを処理できる別のサーバー (例: Apache) で試すことができます。

于 2012-10-14T17:11:25.433 に答える