1

以下のようにajax file upload in djangoコーディングしました.javascript ,django viewファイルは正常にアップロードされます.次に、ビューのテストメソッドを作成しました.テストが実行されると、ファイルは正常に宛先フォルダーにアップロードされます.しかし、奇妙なエラーが発生します.

この特定のエラーは、アプリケーションで ajax アップロードが実行された場合には発生しません。テストが実行された場合にのみ発生します。

$(document).ready(function(){
        $(document).on('change', '#fileselect', function(e){
            e.preventDefault();
            uploadFile(e);
        });

function uploadFile(e){
    var form = $('#fileform').get(0);
    var formData = new FormData(form);
    var file = $('#fileselect').get(0).files[0];
    var xhr = new XMLHttpRequest();
    formData.append('file', file);
    xhr.open('POST', 'upload/', true);
    xhr.send(formData);

    xhr.onreadystatechange=function(){
       if (xhr.readyState==4 && xhr.status==200){
          var data = $.parseJSON(xhr.responseText);
          var uploadResult = data['message']

          if (uploadResult=='failure'){
             displayErrorMessage('failed to upload');
          }else if (uploadResult=='success'){
          }
       }
    }
}
...

ジャンゴビュー

def ajax_upload(request):
    retvals = {}
    message="failure"
    if  (request.method == 'POST'):
        if request.FILES.has_key('file'):
            file = request.FILES['file']
            print 'file=',file
            with open(settings.uploadfolder+'/'+fname, 'wb+') as dest:
                for chunk in file.chunks():
                    dest.write(chunk)
            message="success"
    retvals['message']= message
    serialized = json.dumps(retvals)
    print 'serialized=',serialized
    if message == "success":
        print 'success'
        return HttpResponse(serialized, mimetype="application/json")
    else:
        return HttpResponseServerError(serialized, mimetype="application/json")

urls.py ファイルのスニペット

urls.py

...
url(r'^upload/$', 'myapp.views.ajax_upload',name='ajax_upload'),
...

最後に、ここにテスト方法があります

class UploadTest(TestCase):
    def setUp(self):
        super(UploadTest,self).setUp()
        self.client.login(username='me',password='mypass')

    def test_upload(self):
        fname = os.path.join(settings.testfolder,'mydoc.doc')
        with open(fname) as fp:
            resp = self.client.post(self.client.post(reverse('ajax_upload'),{'file':fp}, HTTP_X_REQUESTED_WITH='XMLHttpRequest'))

ご覧のとおり、いくつかの print ステートメントをビュー コードに入れました。request.FILES['file']正しい値 (つまりmydoc.doc) があり、アップロードが成功したことを示しています (ファイルが dest フォルダーにコピーされていることがわかります)。

エラーメッセージを示すコンソール出力は次のとおりです

file= mydoc.doc
serialized= {"message": "success"}
 success
E
======================================================================
ERROR: test_upload (myapp.tests.UploadTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/me/dev/python/django/myapp/tests.py", line 143, in test_upload_file
    resp = self.client.post(self.client.post(reverse('ajax_upload'),{'file':fp}, HTTP_X_REQUESTED_WITH='XMLHttpRequest'))
  File "/home/me/Django-1.4/django/test/client.py", line 449, in post
    response = super(Client, self).post(path, data=data, content_type=content_type, **extra)
  File "/home/me/Django-1.4/django/test/client.py", line 252, in post
    parsed = urlparse(path)
  File "/usr/lib/python2.6/urlparse.py", line 108, in urlparse
    tuple = urlsplit(url, scheme, allow_fragments)
  File "/usr/lib/python2.6/urlparse.py", line 147, in urlsplit
    i = url.find(':')
AttributeError: 'HttpResponse' object has no attribute 'find'

----------------------------------------------------------------------
Ran 1 test in 0.200s

FAILED (errors=1)

なぜこれが起こるのかわかりませんでした..誰かがこれを理解するのを手伝ってくれますか?

4

1 に答える 1

3
resp = self.client.post(self.client.post(...))

心配しないでください、誰にでも起こります:)

于 2012-06-23T18:36:53.480 に答える