2013-03-14 69 views
2

我設置以下配置的URL端點:在燒瓶中使用與app.add_url_rule默認

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) 

和壓倒一切的get()我ContactAPI類:

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 

當我打的URL /contact/1我得到instid打印爲None

當我刪除從manager.py的defaults={'instid': None},線,我得到instid打印爲1

爲什麼有我的電話,以add_url_rule默認線覆蓋我在我的網址我把?

回答

3

原來我需要使用defaults時註冊兩個端點。

因爲{'instid': None}在我ContactAPI視圖作爲kwarg傳遞到get(),我要告訴瓶設置instid爲無當URL /contact被擊中。

當我點擊/contact/1時,我需要使用<int:instid>。爲此,我需要在add_url_rule()的電話中刪除defaults 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指出了這一點。