在Flask中使用app.add_url_rule的默认值

时间:2013-03-14 22:12:18

标签: python flask

我正在设置一个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调用中的默认行会覆盖我在网址中添加的内容?

2 个答案:

答案 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