2013-07-20 113 views
2

我使用的瓶基於類的意見,使用add_url_rule像這樣創建一個CRUD REST API和註冊路線...重寫瓶add_url_rule路由特定的URL

class GenericAPI(MethodView): 
    def get(self, item_group, item_id): 
     ... 
    def post(self, item_group, item_id): 
     ... 
    ... 

api_view = GenericAPI.as_view('apps_api') 
app.add_url_rule('/api/<item_group>', defaults={'item_id': None}, 
       view_func=api_view, methods=['GET',]) 
app.add_url_rule('/api/<item_group>/<item_id>', 
       view_func=api_view, methods=['GET',]) 
app.add_url_rule('/api/<item_group>/add', 
       view_func=api_view, methods=['POST',]) 
app.add_url_rule('/api/<item_group>/<item_id>/edit', 
       view_func=api_view, methods=['PUT',]) 
app.add_url_rule('/api/<item_group>/<item_id>/delete', 
       view_func=api_view, methods=['DELETE',]) 

它處理特定的數據庫基於item_group的表和使用item_id的條目。所以如果我有/api/person,它會列出人物表的條目。或者如果我有/api/equipment/2,它將在設備表中檢索ID爲2的行。我有很多這些任務,他們都只需要CRUD。

但是,如果我想要覆蓋我的路由時,如果我有其他一些URL,如/api/analysis/summarize這理論上會調用一個功能,即時工作。有沒有辦法做到這一點?

或者是將我的網址擴展爲/api/db/person/api/db/equipment/2以進行一組操作並將/api/other_work_type分配給其他人的唯一方法?

+0

我重讀的文件,發現可以使用'defaults'傳遞值。所以我最終做的不是'app.add_url_rule('/ api//',view_func = api_view,methods = ['GET',])'我把它改成了'app.add_url_rule('/ api/person/',view_func = api_view,methods = ['GET',])' – kentwait

回答

3

您可以正常註冊/api/analysis/summarize。 Werkzeug/Flask根據複雜性(變量的數量)對規則進行排序,首先採用最簡單的路線。

例如: - 訂單的

@app.route('/api/foo') 
def foo(): 
    return "Foo is special!" 

@app.route('/api/<name>') 
def generic(name): 
    return "Hello %s!" % name 

獨立你定義的路由。