Skip to content

Commit 1d7de3b

Browse files
committed
Async handler support
1 parent 127f749 commit 1d7de3b

File tree

4 files changed

+26
-3
lines changed

4 files changed

+26
-3
lines changed

examples/todo/todo/handlers/todo_handlers.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from enum import Enum
1+
import asyncio
22

33
from todo.database import todo_id_sequence, todo_database
44
from todo.app import rebar

flask_rebar/rebar.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ def wrapped(*args: P.args, **kwargs: P.kwargs) -> Union[T, Response]:
176176
if headers_schema:
177177
g.validated_headers = get_header_params_or_400(schema=headers_schema)
178178

179-
rv: Any = f(*args, **kwargs)
179+
rv: Any = current_app.ensure_sync(f)(*args, **kwargs)
180180

181181
if not response_body_schema:
182182
return rv

setup.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"sphinx_rtd_theme==1.2.2",
2121
"types-jsonschema==4.17.0.10",
2222
"types-setuptools==68.0.0.3",
23+
"flask[async]>=2,<4",
2324
]
2425

2526
install_requires = [
@@ -42,7 +43,11 @@
4243
packages=find_packages(exclude=("test*", "examples")),
4344
package_data={"flask_rebar": ["py.typed"]},
4445
include_package_data=True,
45-
extras_require={"dev": development, "enum": ["marshmallow-enum~=1.5"]},
46+
extras_require={
47+
"dev": development,
48+
"enum": ["marshmallow-enum~=1.5"],
49+
"async": ["flask[async]>=2,<4"],
50+
},
4651
install_requires=install_requires,
4752
url="https://github.com/plangrid/flask-rebar",
4853
classifiers=[

tests/test_rebar.py

+18
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
:copyright: Copyright 2018 PlanGrid, Inc., see AUTHORS.
88
:license: MIT, see LICENSE for details.
99
"""
10+
import asyncio
1011
import json
1112
import unittest
1213

@@ -864,3 +865,20 @@ def post_foo(*args, **kwargs):
864865
self.assertIsNotNone(swagger) # really only care that it didn't barf
865866
swagger = SwaggerV3Generator().generate(registry)
866867
self.assertIsNotNone(swagger)
868+
869+
def test_async_handler(self):
870+
rebar = Rebar()
871+
registry = rebar.create_handler_registry()
872+
873+
@registry.handles(
874+
rule="/async",
875+
method="GET",
876+
response_body_schema=DefaultResponseSchema(),
877+
)
878+
async def get_response():
879+
await asyncio.sleep(0)
880+
return DEFAULT_RESPONSE
881+
882+
app = create_rebar_app(rebar)
883+
resp = app.test_client().get(path="/async")
884+
self.assertEqual(resp.status_code, 200)

0 commit comments

Comments
 (0)