我正在使用以下内容设置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指出这一点。

10-07 20:12