Skip to content

Commit

Permalink
Merge pull request #1848 from ashleysommer/fix_named_response_middleware
Browse files Browse the repository at this point in the history
Reverse named_response_middlware execution order, to match normal response middleware execution order.
  • Loading branch information
ashleysommer committed May 14, 2020
2 parents e7001b0 + 4497312 commit 7c04c9a
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 2 deletions.
43 changes: 43 additions & 0 deletions examples/blueprint_middlware_execution_order.py
@@ -0,0 +1,43 @@
from sanic import Sanic, Blueprint
from sanic.response import text
'''
Demonstrates that blueprint request middleware are executed in the order they
are added. And blueprint response middleware are executed in _reverse_ order.
On a valid request, it should print "1 2 3 6 5 4" to terminal
'''

app = Sanic(__name__)

bp = Blueprint("bp_"+__name__)

@bp.middleware('request')
def request_middleware_1(request):
print('1')

@bp.middleware('request')
def request_middleware_2(request):
print('2')

@bp.middleware('request')
def request_middleware_3(request):
print('3')

@bp.middleware('response')
def resp_middleware_4(request, response):
print('4')

@bp.middleware('response')
def resp_middleware_5(request, response):
print('5')

@bp.middleware('response')
def resp_middleware_6(request, response):
print('6')

@bp.route('/')
def pop_handler(request):
return text('hello world')

app.blueprint(bp, url_prefix='/bp')

app.run(host="0.0.0.0", port=8000, debug=True, auto_reload=False)
2 changes: 1 addition & 1 deletion sanic/app.py
Expand Up @@ -653,7 +653,7 @@ def register_named_middleware(
if _rn not in self.named_response_middleware:
self.named_response_middleware[_rn] = deque()
if middleware not in self.named_response_middleware[_rn]:
self.named_response_middleware[_rn].append(middleware)
self.named_response_middleware[_rn].appendleft(middleware)

# Decorator
def middleware(self, middleware_or_request):
Expand Down
34 changes: 33 additions & 1 deletion tests/test_blueprints.py
Expand Up @@ -253,7 +253,7 @@ def handler2(request):


def test_bp_middleware(app):
blueprint = Blueprint("test_middleware")
blueprint = Blueprint("test_bp_middleware")

@blueprint.middleware("response")
async def process_response(request, response):
Expand All @@ -270,6 +270,38 @@ async def handler(request):
assert response.status == 200
assert response.text == "FAIL"

def test_bp_middleware_order(app):
blueprint = Blueprint("test_bp_middleware_order")
order = list()
@blueprint.middleware("request")
def mw_1(request):
order.append(1)
@blueprint.middleware("request")
def mw_2(request):
order.append(2)
@blueprint.middleware("request")
def mw_3(request):
order.append(3)
@blueprint.middleware("response")
def mw_4(request, response):
order.append(6)
@blueprint.middleware("response")
def mw_5(request, response):
order.append(5)
@blueprint.middleware("response")
def mw_6(request, response):
order.append(4)

@blueprint.route("/")
def process_response(request):
return text("OK")

app.blueprint(blueprint)
order.clear()
request, response = app.test_client.get("/")

assert response.status == 200
assert order == [1, 2, 3, 4, 5, 6]

def test_bp_exception_handler(app):
blueprint = Blueprint("test_middleware")
Expand Down

0 comments on commit 7c04c9a

Please sign in to comment.