2016-10-02 43 views
0

我想上传一个图片与休息框架,并与django测试客户端进行测试。它几乎工作,但是当我保存文件我有这个在我的文件的顶部:django图像上传休息框架和测试客户端

--BoUnDaRyStRiNg 
Content-Disposition: form-data; name="plop.png" 

如果我删除那些行,我可以完美阅读我的照片,但我不知道如何摆脱他们。

models.py

class GenericUser(User): 
    avatar = models.ImageField(upload_to=user_directory_path) 

views.py

class AvatarView(APIView): 
    parser_classes = (FileUploadParser,) 
    def post(self, request): 
     up_file = request.data['file'] 
     user = get_object_or_404(GenericUser, pk=request.user.id) 
     user.avatar.save(up_file.name, up_file) 
     user.save() 
     return Response(status=204) 

tests.py

cl = Client(HTTP_AUTHORIZATION="Token {}".format(token)) 
with open(MY_FILE, 'rb') as f: 
    data = f.read() 
res = cl.post('/avatar', {"plop.png" : data}, HTTP_CONTENT_DISPOSITION="attachment; filename=plop.png;") 

任何提示,我怎么能做出这样的工作?

回答

0

这个工作如我所料: views.py

class AvatarView(APIView): 
    parser_classes = (MultiPartParser,) 
    def post(self, request): 
     up_file = request.data["file"] 
     user = get_object_or_404(GenericUser, pk=request.user.id) 
     user.avatar.save(up_file.name, up_file) 
     user.save() 
     return Response(status=204) 

test.py

cl = Client(HTTP_AUTHORIZATION="Token {}".format(token)) 
with open(MY_FILE, 'rb') as f: 
    res = cl.post('/avatar', {"file" : f}) 
+0

很高兴你的工作。:) – ostergaard

0

试试这个:

res = cl.post('/avatar?filename=plop.png', {"plop.png" : data}) 

或多或少从Django文档:

with open(MY_FILE, 'rb') as f: 
    cl.post('/avatar', {"filename" : f}) 
+0

感谢您的帮助,两种解决方案都失败了。似乎django测试客户端确实需要HTTP_CONTENT_DISPOSITION =“attachment; filename = plop.png;”来格式化一个FileUploadParser可以理解的请求我会试着找出使用wireshark的错误我想 – Jeremad

+0

:(你是否尝试使用MultiPartParser?你正在删除的文本看起来像是多部分MIME文件的分隔符。来自DRF文档的建议,其中文件名是URL的一部分:url(r'^ upload /(?P [^ /] +)$',FileUploadView.as_view()) – ostergaard

+0

将URL作为URL的一部分。我正在尝试MultiPartParser – Jeremad