Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 16 additions & 11 deletions flask_classy.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import functools
import inspect
from werkzeug.routing import parse_rule
from werkzeug.exceptions import HTTPException
from flask import request, Response, make_response
import re

Expand Down Expand Up @@ -197,17 +198,21 @@ def proxy(**forgettable_view_args):
if response is not None:
return response

response = view(**request.view_args)
if not isinstance(response, Response):
response = make_response(response)

after_view_name = "after_" + name
if hasattr(i, after_view_name):
after_view = getattr(i, after_view_name)
response = after_view(response)

if hasattr(i, "after_request"):
response = i.after_request(name, response)
try:
response = view(**request.view_args)
except HTTPException as response:
raise response
finally:
if response and not isinstance(response, Response):
response = make_response(response)

after_view_name = "after_" + name
if hasattr(i, after_view_name):
after_view = getattr(i, after_view_name)
response = after_view(response)

if hasattr(i, "after_request"):
response = i.after_request(name, response)

return response

Expand Down
10 changes: 10 additions & 0 deletions test_classy/test_view_wrappers.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,16 @@ def test_after_request():
resp = client.get("/afterrequest/")
eq_(b"After Request", resp.data)

def test_after_request_with_abort():
resp = client.post("/afterrequest/")
ok_(b"Stopped by post" in resp.data)
ok_(AfterRequestView.after_called == True)

def test_after_request_with_error():
resp = client.put("/afterrequest/")
eq_(resp.status_code, 500)
ok_(AfterRequestView.after_called == True)

def test_decorated_view():
resp = client.get("/decorated/")
eq_(b"Index", resp.data)
Expand Down
11 changes: 11 additions & 0 deletions test_classy/view_classes.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from flask import abort
from flask_classy import FlaskView, route
from functools import wraps

Expand Down Expand Up @@ -143,12 +144,22 @@ def index(self):

class AfterRequestView(FlaskView):

def before_request(self, name):
self.__class__.after_called = False

def after_request(self, name, response):
self.__class__.after_called = True
return "After Request"

def index(self):
return "Index"

def post(self):
abort(422, "Stopped by post")

def put(self):
error('UnknownError')

class VariedMethodsView(FlaskView):

def index(self):
Expand Down