在django测试ajax文件上传时出现奇怪的错误

问题描述:

我正在尝试ajax file upload in django。我编码javascript ,django view如下。文件上传成功。然后我写了一个测试方法的视图。当测试执行时,文件得到成功上传到目标文件夹。但是,我收到了一些奇怪的错误。在django测试ajax文件上传时出现奇怪的错误

在应用程序中执行ajax上载时,不会发生此特定错误。只有在执行测试时才会发生此问题。从urls.py文件

$(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'){ 
      } 
     } 
    } 
} 
... 

Django的视图

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

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

最后,这里是测试方法

​​

正如你所看到的,我在视图代码中添加了一些打印语句,它们显示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) 

我不明白为什么这occurs..can有人帮我想出解决办法?

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

不要着急,恰巧大家:)

+0

我的天啊,多么愚蠢的错误..谢谢Vasilly – damon