我正在使用以下内容设置URL终结点:
经理.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()
:视图.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
当我点击URL
/contact/1
时,我得到instid
打印为None
。当我从manager.py中删除
defaults={'instid': None},
行时,会将instid
打印为1。为什么在调用
add_url_rule
时让defaults行覆盖我在URL中输入的内容? 最佳答案
当使用defaults
时,我需要注册两个端点。
因为{'instid': None}
在我的contactapi视图中作为kwarg传递到get()
中,所以当urlinstid
被点击时,我需要告诉flask将/contact
设置为none。
当我点击/contact/1
时,我需要使用<int:instid>
。为此,我需要删除调用defaults
时的add_url_rule()
kwarg。
经理.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
感谢烧瓶IRC通道中的
asdf
指出这一点。