2016-07-25 44 views
0

我停留在藍圖時,我試圖用燒瓶藍圖的add_url_rule瓶藍圖url_for BuildError使用add_url_rule

的方式時,這裏是我的燒瓶項目結構:

myapp 
... __init__.py 
... app.py 
... model 
... static 
... views 
...... main.py 
... templates 
...... base.html 
...... results.html 

在main.py,這裏是我的代碼:

from flask import Flask, url_for, Blueprint 
main_bp = Blueprint('main', __name__) 

def home(): 
    return redirect(url_for('main.results')) 

def results(): 
    # some code 
    return render_template('result.html') 

,並在我的app.py,下面的代碼:

當我使用

Traceback (most recent call last): 
File "/Users/deamon/venv/src/staticngclient/staticng_client/middlewares/wsgi.py", line 25, in __call__ 
return app(environ, start_response) 
File "/Users/deamon/venv/src/daeprofiling/dae_profiling/middleware.py", line 24, in __call__ 
    return self.app(environ, start_response) 
File "/Users/deamon/venv/src/doubancommonlib/douban/common/middleware/content_filter.py", line 18, in __call__ 
    app_iter = self.application(environ, response.start_response) 
File "/Users/deamon/dae/app/web.py", line 77, in __call__ 
    return handler(environ, start_response) 
File "/Users/deamon/Projects/dae/dae/handlers/__init__.py", line 65, in __call__ 
    return self.app(environ, start_response) 
File "/Users/deamon/Projects/dae/dae/handlers/web.py", line 46, in __call__ 
    return self._app(*a, **kw) 
File "/Users/deamon/venv/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
File "/Users/deamon/venv/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
File "/Users/deamon/venv/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
File "/Users/deamon/venv/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
File "/Users/deamon/venv/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
File "/Users/deamon/venv/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
File "/Users/deamon/venv/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request 
    rv = self.dispatch_request() 
File "/Users/deamon/venv/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
File "/Users/deamon/kiwi/views/main.py", line 19, in home 
    return redirect(url_for('main.results')) 
File "/Users/deamon/venv/lib/python2.7/site-packages/flask/helpers.py", line 312, in url_for 
    return appctx.app.handle_url_build_error(error, endpoint, values) 
File "/Users/deamon/venv/lib/python2.7/site-packages/flask/app.py", line 1641, in handle_url_build_error 
    reraise(exc_type, exc_value, tb) 
File "/Users/deamon/venv/lib/python2.7/site-packages/flask/helpers.py", line 305, in url_for 
    force_external=external) 
File "/Users/deamon/venv/lib/python2.7/site-packages/werkzeug/routing.py", line 1678, in build 
    raise BuildError(endpoint, values, method) 
BuildError: ('main.results', {}, None) 

此外,在MYE模板,如base.html文件或results.html,:當我訪問的索引頁

,我總是得到以下錯誤消息

 <a class="navbar-brand" href="{{ url_for('main.home') }}">kiwi</a> 

發生同樣的錯誤。

有人可以幫忙嗎?

回答

1

好吧,所以我看到的第一個問題就是即使您嘗試使用藍圖,但您實際上並沒有對它做任何事情。

是的,在你創建它的行main_bp = Blueprint('main', __name__)中,但之後你並沒有實際註冊任何url端點,而是嘗試在主應用程序中通過導入來完成它。

因爲你實際上並沒有註冊端點的藍圖而是試圖通過調用main.results前綴的藍圖,共創重定向它的主要'你url_for功能失效。

這是你的代碼看起來如何正確使用藍圖

藍圖

from flask import Flask, url_for, Blueprint 
main_bp = Blueprint('main', __name__) 

@main_bp.route('/') 
def home(): 
    return redirect(url_for('main.results')) 

@main_bp.route('/results') 
def results(): 
    # some code 
    return render_template('result.html') 

和app.py

from myapp.views.main import main_bp 

app.register_blueprint(main_bp) 

或者,如果你想使用add_url_rule(工作確切地說就像裝飾者)只需在藍圖文件中使用main_bp.add_url_rule(...)即可。

與add_url_rule工作實例

藍圖文件

from flask import Flask, url_for, Blueprint, redirect, render_template 
main_bp = Blueprint('main', __name__) 

def home(): 
    return redirect(url_for('main.results')) 

def results(): 
    # some code 
    return 'some results' 

main_bp.add_url_rule('/', view_func=home) 
main_bp.add_url_rule('/results', view_func=results) 

app文件

from flask import Flask 
import bp 

app = Flask(__name__) 


app.register_blueprint(bp.main_bp) 



if __name__ == '__main__': 
    app.run() 
+0

感謝您的分析。我想使用'main_bp.add_url_rule(...)',但代碼不起作用。這裏是我在'main.py'中的代碼:'main_bp.add_url_rule('/',view_func = home)',我知道'view_func = home'不正確,但我不知道什麼是正確的。那麼你能否糾正我的代碼? – shitoujizu

+0

@shitoujizu在我的文章的最後添加了add_url_rule的工作示例,但您應該使用裝飾器語法,因爲它更直接。如果您有任何問題,請發佈錯誤日誌。 – MadRabbit

+0

我明白了。 'decorator'和'add_url_rule'都適用於你的例子。你解決了我的問題。謝啦。 – shitoujizu