2016-10-02 70 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