我正在使用Flask並且有需要授權的端點(偶爾還有其他應用程序特定的標頭)。在我的測試中,使用test_client
函數創建一個客戶端,然後執行各種獲取,放入,刪除調用。所有這些呼叫都需要授權,並添加其他頭文件。我如何設置測試客戶端將所有請求放在這樣的頭文件中?在Flask測試中爲所有請求設置HTTP標頭
5
A
回答
11
您可以包裝WSGI應用程序,並有注入頭:
from flask import Flask, request
import unittest
def create_app():
app = Flask(__name__)
@app.route('/')
def index():
return request.headers.get('Custom', '')
return app
class TestAppWrapper(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
environ['HTTP_CUSTOM'] = 'Foo'
return self.app(environ, start_response)
class Test(unittest.TestCase):
def setUp(self):
self.app = create_app()
self.app.wsgi_app = TestAppWrapper(self.app.wsgi_app)
self.client = self.app.test_client()
def test_header(self):
resp = self.client.get('/')
self.assertEqual('Foo', resp.data)
if __name__ == '__main__':
unittest.main()
9
的Client
類取相同的參數EnvironBuilder
類,其中之一是headers
關鍵字參數。
因此,您可以簡單地使用client.get('/', headers={ ... })
發送您的身份驗證。
現在,如果你想提供從客戶端頭的默認設置,你需要提供自己實現open
它提供一個修改後的環境生成器(類似於make_test_environ_builder
),並設置app.test_client_class
指向您新班。
2
大廈@DazWorrall答案,並尋找到WERKZEUG源代碼,我結束了以下包裝傳遞,我需要進行身份驗證默認頭:
class TestAppWrapper:
""" This lets the user define custom defaults for the test client.
"""
def build_header_dict(self):
""" Inspired from : https://github.com/pallets/werkzeug/blob/master/werkzeug/test.py#L591 """
header_dict = {}
for key, value in self._default_headers.items():
new_key = 'HTTP_%s' % key.upper().replace('-', '_')
header_dict[new_key] = value
return header_dict
def __init__(self, app, default_headers={}):
self.app = app
self._default_headers = default_headers
def __call__(self, environ, start_response):
new_environ = self.build_header_dict()
new_environ.update(environ)
return self.app(new_environ, start_response)
然後,您可以使用它像:
class BaseControllerTest(unittest.TestCase):
def setUp(self):
_, headers = self.get_user_and_auth_headers() # Something like: {'Authorization': 'Bearer eyJhbGciOiJ...'}
app.wsgi_app = TestAppWrapper(app.wsgi_app, headers)
self.app = app.test_client()
def test_some_request(self):
response = self.app.get("/some_endpoint_that_needs_authentication_header")
0
您可以在測試客戶端內設置標題。
client = app.test_client()
client.environ_base['HTTP_AUTHORIZATION'] = 'Bearer your_token'
然後你可以使用頭從請求:
request.headers['Authorization']
相關問題
- 1. 爲所有http請求設置默認標頭不起作用
- 2. 如何爲在UIWebView中加載的所有請求設置http標頭?
- 3. 需要設置所有http請求的默認標頭
- 4. NSURL請求設置HTTP標頭
- 5. 設置http請求消息標頭ios
- 6. 如何在behat測試中設置請求標頭?
- 7. 請求HTTP標頭
- 8. HTTP請求標頭
- 9. 在ajax中設置請求標頭
- 10. 在Node.js中設置請求標頭
- 11. 在java中設置請求標頭
- 12. 在硒中設置請求標頭
- 13. 在URL中設置請求標頭?
- 14. 在JavaScript中設置請求標頭
- 15. StringContentProvider是否在HTTP請求中設置Content-Type標頭?
- 16. 在驅動器請求中設置HTTP標頭
- 17. 在HTTP請求標頭中設置LTPA令牌
- 18. 在Angular2 HTTP POST中設置JSON請求標頭
- 19. 爲WebClient請求設置User-Agent標頭
- 20. 爲Django設置AJAX請求標頭
- 21. 如何爲http請求設置「Date」標頭
- 22. AngularJS - 設置適用於所有http請求的通用Basic Auth標頭
- 23. 在Django測試中設置HTTP_REFERER標頭
- 24. PHP流 - 獲取所有HTTP請求頭
- 25. 從javascript中設置常規HTTP請求標頭
- 26. 無法在$ .ajax請求上設置HTTP主機標頭
- 27. 更改Alamofire中所有請求的HTTP標頭
- 28. 更改http請求標頭
- 29. 解析http請求標頭
- 30. 在Spring集成中將json請求參數設置爲http標頭