2013-04-15 39 views
2

所以,我知道服務器代碼的作品,因爲這個網站目前正在生產和工作正常。另一方面,我開發了一個測試腳本來對API進行單元測試。我正在嘗試使用HTTP POST方法將PDF文件發送到服務器的nginx - > gunicorn - > flask應用程序環境。Python請求庫傳遞PDF到Django服務器

服務器以獲取附件:

@app.route('<ObjectId:_id>/attachments', methods=['POST']) 
@csrf.exempt 
@opportunity_owner_required 
@auth.login_required 
@nocache 
def upload_attachment(_id): 
    upload = request.files.get('file') 
    if not upload: 
     abort(400, "Missing attached file.") 

,我嘗試和PDF文件,傳遞到服務器:

def test_add_opportunity_attachment(self): 
    files = {'file': ("mozilla.pdf", open('%s/mozilla.pdf' % PATHTOFILE, 'rb'))} 
    headers = {'Content-Type': 'application/pdf', "enctype": "multipart/form-data", "Content-Disposition":"attachment;filename=mozilla.pdf"} 
    r=self.session.post(self.formatURL('/attachments'), headers=headers, files=files) 
    assert r.status_code == 200 

但我總是得到狀態400

當使用ngrep來跟蹤輸出時,我確實看到似乎是通過網絡傳遞的PDF的編碼形式,但服務器看不到它。

請注意:由於其專有性質,部分信息丟失。但是測試功能中使用的所有功能都可以正常工作。 formatURL按預期的格式將其格式化,並且url確實匹配。

+1

嘗試刪除您的自定義標題。我認爲通過設置那些你寫過的請求會爲你生成的正確的。 –

+0

@ sigmavirus24試過,也沒有成功。 –

+0

您的身份驗證已附加到我假設的會話中。 'formatURL'正在返回一個我希望的有效網址。我現在沒有時間查看燒瓶的文檔,但其他人可能會更好地瞭解文件屬性。由於'multipart/form-data'請求中可能有多個文件,你確定'.get('file')'是正確的嗎? –

回答

1

所以這個問題比我想象的要難一些。服務器上的一些後端邏輯,將文件保存到一個目錄中,然後繼續到URL位置的@ app.route()。我的本地副本上有一些丟失的權限,所以當它嘗試保存PDF文件時,上傳將失敗。

的另一個問題,是如上所述通過sigmavirus24指出,自定義首部沒有正確的設置,所以最終的版本,這樣的作品,看起來像:

def test_add_opportunity_attachment(self): 
    payload = {"title": "Testing upload title", "description": "Testing upload description"} 
    file_contents = open('%s/mozilla.pdf' % PATHTOFILE, 'rb') 
    files = {'file': ('mozilla.pdf', file_contents)} 
    r=self.session.post(self.formatURL('/attachments'), files=files, data=payload) 
    if r.status_code != 200: 
     assert r.status_code == 409 #Successful, but no duplicates allowed. 
+0

很高興得到了一些幫助。我從不考慮本地計算機上的文件權限,因爲您始終認爲這些文件不應該存在問題。乾杯! –

相關問題