3

我正在使用以下内容设置 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)

get()并在我的 ContactAPI 类中覆盖:

视图.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/1instid打印为None.

当我defaults={'instid': None},从 manager.py 中删除该行时,我instid打印为 1。

为什么在我的调用中有默认行来add_url_rule覆盖我在我的 URL 中输入的内容?

4

2 回答 2

4

事实证明,我需要在使用时注册两个端点defaults

因为在我的 ContactAPI 视图中作为 kwarg{'instid': None}传递get(),所以我需要告诉 Flaskinstid在 URL/contact被命中时设置为 None。

当我击中时/contact/1,我需要使用<int:instid>。为此,我需要defaults在对add_url_rule().

管理器.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

感谢asdf在#flask IRC 频道中指出这一点。

于 2013-03-14T22:41:50.063 回答
1

烧瓶文档中有一个类似事情的完整示例 - https://flask.palletsprojects.com/en/1.1.x/views/

于 2015-04-14T00:47:10.720 回答