<Python, flask> test_client()
Flask
さんをやっていて、app.app_context()
をやるがいいが、
実際の動作request
に対する応答を確認するいい方法がないかと思っていたら、ありました。
さすがっす。
app.test_client()
らしいっす。
このまえ、かりかり作ったスクリプト(下)でちと実験。
In [1]: import restapi In [3]: restapi.db.create_all() In [5]: app = restapi.app.test_client() In [6]: type(app) Out[6]: flask.testing.FlaskClient In [7]: dir(app) Out[7]: ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'allow_subdomain_redirects', 'application', 'cookie_jar', 'delete', 'delete_cookie', 'environ_base', 'get', 'head', 'open', 'options', 'patch', 'post', 'preserve_context', 'put', 'resolve_redirect', 'response_wrapper', 'run_wsgi_app', 'session_transaction', 'set_cookie', 'trace'] In [8]: app.get('/') Out[8]: <Response streamed [404 NOT FOUND]> In [11]: app.get('/sqlalc/1/Taro/Hage') Out[11]: <Response streamed [403 FORBIDDEN]> In [12]: app.put('/sqlalc/-/Taro/Hage') Out[12]: <Response streamed [200 OK]> In [13]: app.get('/sqlalc/1/Taro/Hage') Out[13]: <Response streamed [200 OK]> In [15]: r = app.get('/sqlalc/1/Taro/Hage') In [17]: r.get_data() Out[17]: b'{\n "id": 1, \n "looks": "Hage", \n "name": "Taro", \n "r": "GET success"\n}\n' In [18]: r.get_data().decode('UTF-8') Out[18]: '{\n "id": 1, \n "looks": "Hage", \n "name": "Taro", \n "r": "GET success"\n}\n' In [19]: import json In [20]: json.loads(r.get_data().decode('UTF-8')) Out[20]: {'id': 1, 'looks': 'Hage', 'name': 'Taro', 'r': 'GET success'} In [21]: r.status Out[21]: '200 OK' In [22]: r.status_code Out[22]: 200
にゃるほど!
マニュアル。
API — Flask Documentation (0.12)
Testing Flask Applications — Flask Documentation (0.12)
お世話になったところ。
追記。
app.app_context()
からも順に呼べば、app.test_client()
が呼べる。
In [23]: ctx = restapi.app.app_context() In [25]: type(ctx) Out[25]: flask.ctx.AppContext In [26]: ctx.app.test_client() Out[26]: <FlaskClient <Flask 'restapi'>> In [27]: type(ctx.app.test_client()) Out[27]: flask.testing.FlaskClient In [28]: type(app) Out[28]: flask.testing.FlaskClient