我正在设置一个url端点,其中包含以下内容:
manager.py
from xxx import ContactAPI
from xxx.models import Contact
# self.app is my Flask app
# self.session is SQLAlchemy Session
api_name = 'contact'
instance_endpoint = '/%s/<int:instid>' % api_name
methods = ['GET']
api_view = ContactAPI.as_view(api_name, self.session,
Contact, app)
self.app.add_url_rule(instance_endpoint, methods=methods,
defaults={'instid': None},
view_func=api_view)
在我的ContactAPI类中覆盖get()
:
views.py
from flask.views import MethodView
class ContactAPI(MethodView):
def __init__(self, session, model, app, *args, **kwargs):
super(ContactAPI, self).__init__(*args, **kwargs)
def get(self, instid):
print instid
当我点击网址/contact/1
时,我将instid
打印为None
。
当我从manager.py中删除defaults={'instid': None},
行时,我将instid
打印为1。
为什么我的add_url_rule
调用中的默认行会覆盖我在网址中添加的内容?
答案 0 :(得分:3)
事实证明,在使用defaults
时,我需要注册两个端点。
由于{'instid': None}
作为kwarg传递到我的ContactAPI视图中的get()
,我需要告诉Flask在点击网址instid
时将/contact
设置为无。
当我点击/contact/1
时,我需要使用<int:instid>
。为此,我需要在调用defaults
时删除add_url_rule()
kwarg。
<强> manager.py 强>
from xxx import ContactAPI
from xxx.models import Contact
# self.app is my Flask app
# self.session is SQLAlchemy Session
api_name = 'contact'
instance_endpoint = '/%s/<int:instid>' % api_name
collection_endpoint = '/%s' % api_name
methods = ['GET']
api_view = ContactAPI.as_view(api_name, self.session,
Contact, app)
self.app.add_url_rule(instance_endpoint, methods=methods,
view_func=api_view)
self.app.add_url_rule(collection_endpoint, methods=methods,
defaults={'instid': None},
view_func=api_view)
相关的Werkzeug文档:http://werkzeug.pocoo.org/docs/routing/#werkzeug.routing.Rule
感谢#flask IRC频道中的asdf
指出这一点。
答案 1 :(得分:2)
烧瓶文档中有一个类似的完整例子 - http://flask.pocoo.org/docs/0.10/views/#method-views-for-apis