Ich verwende Flask und habe Endpunkte, die eine Autorisierung erfordern (und gelegentlich andere App-spezifische Header). In meinen Tests verwenden Sie die test_client
-Funktion, um einen Client zu erstellen und dann die verschiedenen Aufrufe von get, put, delete auszuführen. Alle diese Anrufe erfordern eine Autorisierung und weitere Header müssen hinzugefügt werden. Wie kann ich den Testclient einrichten, um solche Header auf alle Anfragen zu setzen?HTTP-Header für alle Anfragen in einem Flask-Test setzen
Antwort
Sie können die WSGI App wickeln und Header dort injizieren:
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()
Die Client
Klasse nimmt die gleichen Argumente wie die EnvironBuilder
Klasse, darunter die headers
Schlüsselwort-Argument.
So können Sie einfach client.get('/', headers={ ... })
verwenden, um Ihre Authentifizierung zu senden.
Nun, wenn Sie einen Standardsatz von Header aus dem Client zur Verfügung zu stellen mögen, müssen Sie Ihre eigene Implementierung von open
zu schaffen, die einen modifizierte Umgebung Builder (ähnlich make_test_environ_builder
) liefert und setzten app.test_client_class
auf Ihren Punkt neue Klasse.
Aufbauend auf @DazWorrall Antwort, und Blick in die Werkzeug-Quellcode, ich mit dem folgenden Wrapper für die Weitergabe Standard Headers gelandet, die ich für die Authentifizierung benötigt:
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)
Sie können dann verwenden Sie es mögen:
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")
Sie können Header innerhalb Testclient festlegen.
client = app.test_client()
client.environ_base['HTTP_AUTHORIZATION'] = 'Bearer your_token'
Dann können Sie Header aus Anfrage verwenden:
request.headers['Authorization']
- 1. wo Standard Solr Abfrageparameter für alle Anfragen setzen
- 2. Port in Anfragen setzen
- 3. Guice inject httpheader
- 4. Vorfilter für alle POST-Anfragen in Sinatra?
- 5. Style für alle Elemente in ContentPresenter setzen
- 6. IIS zeigen Upgrade Website für alle Anfragen
- 7. RestKit benutzerdefinierte Header für alle Anfragen hinzufügen?
- 8. Wie alle Anfragen von einem bestimmten Code in Magento
- 9. Wie aktiviert man das Caching für alle Anfragen in yii2?
- 10. Rails 4.2: Domain für alle Cookies setzen
- 11. Wie man eine HTTP-Http bekommen und setzen Sie httpHeader in Swift?
- 12. Alle AJAX-Anfragen ablehnen
- 13. So senden Sie HTTPHeader mit QT WebEngine?
- 14. iOS Alamofire alle Anfragen stoppen
- 15. AngularJS alle $ HTTP-Anfragen abfangen
- 16. CORS in Grals - Alle Anfragen fehlschlagen?
- 17. jQuery alle ausstehenden AJAX-Anfragen abbrechen
- 18. Kann ich Header in domainübergreifenden JSON-Anfragen setzen?
- 19. Stalling Zeit für alle Anfragen nur auf Chrom
- 20. Wie erzwinge ich, dass Disqus HTTPS für alle Anfragen verwendet?
- 21. umleiten alle Anfragen mit einer Ausnahme url
- 22. Apache Bench: Mittelwert vs Mittelwert für alle gleichzeitigen Anfragen
- 23. Wie spezifiziert man einen Abfrageparameter für alle Anfragen?
- 24. HTTP-Header für alle PHP-Skripte über .htaccess-Datei setzen
- 25. CloudFront umleiten alle Anfragen mit Pfad-Präfix
- 26. Globale Konfiguration von $ http für die Verwendung von CORS in angularJS (feste Domäne für alle Anfragen)
- 27. Django-Anwendung mit einem großen Panda-Objekt, das für alle Anfragen freigegeben wurde?
- 28. Wie setze ich Standard-HTTP-Header für alle Anfragen in Ionic 2?
- 29. IIS: Alle Anfragen auf eine Seite umleiten?
- 30. AOP für alle Methoden in einem Paket