2013-04-09 147 views
3

燒瓶中的url_for生成器不適用於我的某個視圖(它適用於其他視圖)。發電機給/user/?name=Joe,而我期望/u/Joe燒瓶url_for生成錯誤的URL

在模板中,我試圖讓該URL使用用戶頁面:{{ url_for('user', name = g.user.name) }}

這是對應的視圖功能:

@app.route('/u/<name>') 
@login_required 
def user(name): 

起初,這是工作,但事情發生了轉變。我試圖改變視圖名稱和URL沒有運氣。

有什麼想法?我在這一個茫然......

完整的應用程序可在GitHub上:https://github.com/joehand/weight-and-more-tracker

編輯:該@login_required裝飾是瓶登錄提供的一個。

此外,刪除<name>變量不能解決問題。網址就是/user

回答

3

在api.py您註冊名稱爲「用戶」這可能是一個名爲「用戶」的方法相沖突的視圖。

+0

這絕對是導致問題的原因 - Flask默認使用提供給它的函數的__name__來註冊路由。但是,如果提供了兩個具有相同「名稱」的條目,則最後一個條目將獲勝。 [Flask-MongoRest](https://github.com/elasticsales/flask-mongorest/blob/master/flask_mongorest/__init__.py)使用'add_url_rule'向Flask註冊自己 - 並使用'name'關鍵字參數告訴Flask如何註冊它。所以'user'函數被'user' MongoRest類覆蓋。 – 2013-04-10 02:34:19

+0

謝謝!!!這解決了它。我將確保爲API路線使用更具體的名稱。 – joehand 2013-04-10 03:54:57

0

你'包裝'你的功能login_required裝飾者?在你的情況下,name作爲查詢字符串提供給url,而不是一個瓶頸視圖函數參數 - 也許瓶沒有你裝飾的user視圖函數的參數說明的控制。

docs

讓我們實現這樣的裝飾。裝飾器是 返回函數的函數。其實很簡單。 在執行這樣的事情時唯一要記住的是更新名稱,模塊和函數的其他屬性的 。這經常被遺忘,但你不必親自去做,有一個 函數用於裝飾器(functools.wraps())。

from functools import wraps 
from flask import g, request, redirect, url_for 

def login_required(f): 
    @wraps(f) 
    def decorated_function(*args, **kwargs): 
     if g.user is None: 
      return redirect(url_for('login', next=request.url)) 
     return f(*args, **kwargs) 
    return decorated_function 
+0

@login_required裝飾器是由Flask-Login擴展提供的裝飾器。刪除裝飾器並不能解決任何問題。 – joehand 2013-04-09 19:13:14