Browse Source

Add the ability to combine MethodViews

pull/1936/head
Antoine Catton 9 years ago
parent
commit
516ce59f95
  1. 6
      flask/views.py
  2. 42
      tests/test_views.py

6
flask/views.py

@ -102,12 +102,16 @@ class View(object):
return view
def get_methods(cls):
return getattr(cls, 'methods', []) or []
class MethodViewType(type):
def __new__(cls, name, bases, d):
rv = type.__new__(cls, name, bases, d)
if 'methods' not in d:
methods = set(rv.methods or [])
methods = set(m for b in bases for m in get_methods(b))
for key in d:
if key in http_method_funcs:
methods.add(key.upper())

42
tests/test_views.py

@ -160,3 +160,45 @@ def test_endpoint_override():
# But these tests should still pass. We just log a warning.
common_test(app)
def test_multiple_inheritance():
app = flask.Flask(__name__)
class GetView(flask.views.MethodView):
def get(self):
return 'GET'
class DeleteView(flask.views.MethodView):
def delete(self):
return 'DELETE'
class GetDeleteView(GetView, DeleteView):
pass
app.add_url_rule('/', view_func=GetDeleteView.as_view('index'))
c = app.test_client()
assert c.get('/').data == b'GET'
assert c.delete('/').data == b'DELETE'
assert sorted(GetDeleteView.methods) == ['DELETE', 'GET']
def test_remove_method_from_parent():
app = flask.Flask(__name__)
class GetView(flask.views.MethodView):
def get(self):
return 'GET'
class OtherView(flask.views.MethodView):
def post(self):
return 'POST'
class View(GetView, OtherView):
methods = ['GET']
app.add_url_rule('/', view_func=View.as_view('index'))
c = app.test_client()
assert c.get('/').data == b'GET'
assert c.post('/').status_code == 405
assert sorted(View.methods) == ['GET']

Loading…
Cancel
Save