2014-12-07 59 views
2

我正在使用Django Rest框架。在權限類中,我檢查兩個自定義http頭的值:mt_api_tokenmt_api_key自定義HTTP標頭是不同的測試和httpie

在測試中,我使用自定義標題調用API。 sign_request()返回{'mt_api_key': api_client.client_id, 'mt_api_token': token}

class APIv1SimpleTestCase(APITestCase): 
    [...] 
    response = self.client.get(url, format='json', **sign_request("", api_client=oauth2_client)) 

這是一個遺留系統,標頭必須有下劃線而不是破折號。

權限類:

class AuthPermissions(permissions.BasePermission): 
    def is_token_valid(self, request): 
     mt_api_token = request.META['mt_api_token'] 
     [...] 

測試通過。 但是,如果我叫使用httpie的API:

$ http :8000/api/v1/endpoint1/ mt_api_key:0a9..66 mt_api_token:7b2...8 

我得到KeyError異常例外,因爲request.META['mt_api_key']request.META['mt_api_token']不存在。

我必須使用request.META['HTTP_MT_API_TOKEN'],這有意義根據DRF documentation for request.META,但我找不到爲什麼測試通過。如果我將實現更改爲request.META ['HTTP _...']我的測試失敗。

回答

1

這在測試中工作正常,因爲測試是手動設置request.META鍵以匹配您傳遞的內容,mt_api_tokenmt_api_key。你沒有看到任何錯誤,因爲這是完全有效的,但它不符合你的期望。這在Django advanced testing documentation中非常簡短,但基本上額外的參數是directly addedMETA字典。

當您的請求通過Django提供的WSGI處理程序時,任何HTTP標頭都會自動添加前綴HTTP_per the WSGI specification。這適用於大多數客戶端提供的HTTP標頭,包括Authorization標頭,通常用於授權用戶使用API​​(使用基本身份驗證,OAuth等),該標頭放入request.META字典中作爲HTTP_AUTHORIZATION。請注意,由於HTTP標頭名稱不區分大小寫,所以鍵也總是大寫。

您可以通過讓您的sign_request方法返回鍵爲HTTP_MT_API_TOKENHTTP_MT_API_KEY來修復測試,這些鍵是通過瀏覽器傳入時的內容。您還需要調整視圖代碼以引用這些新密鑰。

+0

嗨@kevinbrown我不想改變sign_request方法,但沒有確定它是否合理。感謝這個奇妙的解釋 – 2014-12-08 20:50:48