2013-10-06 36 views
6

url_for是否可以跨藍圖工作?使用url_for藍圖

/flaskapp 
    /runserver.py   (from server import app; app.run(debug=True)) 
    /server 
     /__init__.py  (app = Flask(__name__)) 
     /pages 
      /__init__.py ('pages' blueprint) 
     /users 
      /__init__.py ('users' blueprint) 
server/__init__.py

from server.pages import pages 
from server.users import users 

app = Flask(__name__) 

app.register_blueprint(pages) 
app.register_blueprint(users) 

server/pages/__init__.py

pages = Blueprint('pages', __name__) 

@pages.route('/') 
def index(): return '<h1>Index</h1>' 

server/users/__init__.py

users = Blueprint('users', __name__) 

@users.route('/login') 
def login(): 
    ... 
    return redirect(url_for('pages.index')) 
        ^^^^^^^^^^^^^^^^^^^^^^ 

url_for通話提高BuildError: ('pages.index', {}, None) 什麼是將達到'pages.index'

(我嘗試導入模塊,但沒有工作)

+1

我試過你的例子Flask 0.10.1,我無法重新創建問題。這看起來像是應該起作用的,也許你已經拋棄了一些實際上很重要的代碼?如果可能,請嘗試在單個python文件中重新創建問題併發布該python文件。另外,在你的app.debug之前,打印到控制檯'app.url_map',它將列出端點的所有規則。 –

回答

3

簡短的回答:是的

龍(ISH)答:

盡我可以告訴,你組織你應用程序的方式。

我已經重新創建了您的設置(雖然在一個文件中),您可以在這裏結帳。這段代碼在我的機器上運行。

https://gist.github.com/enlore/80bf02346d6cabcba5b1

在燒瓶中,可以用從所屬藍圖內的相對端點(.login),或通過絕對酮(user.login)的任何地方訪問給定視圖的功能。

我的錢是在你有一個視圖函數名稱錯字。

像Mark Hildreth在評論中說的,調試你的問題的好方法是看看你的url地圖。

>>> from app import app 
>>> app.url_map 
Map([<Rule '/login' (HEAD, OPTIONS, GET) -> user.login>, 
<Rule '/' (HEAD, OPTIONS, GET) -> pages.index>, 
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>]) 
>>> 
2

如果您正在使用url_value_preprocessor確保你是正確的url_defaults設置否則url_for就沒有足夠的價值觀來建立的網址,你會得到這個頗爲混亂的錯誤消息。

例子。

@bp.url_value_preprocessor 
def get_project(endpoint, values): 
    project_name = values.pop('project_name') 
    g.project = Project.query.filter_by(name=project_name).first_or_404() 

@bp.url_defaults 
def add_project(endpoint, values): 
    if 'project_name' in values or not g.project: 
     return 
    values['project_name'] = g.project.name