Python 使用“添加url”规则时生成错误的url\u

Python 使用“添加url”规则时生成错误的url\u,python,flask,blueprint,url-for,Python,Flask,Blueprint,Url For,当我试图以add\u url\u rule 以下是我的flask项目结构: 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 = Blueprin

当我试图以
add\u url\u rule

以下是我的flask项目结构:

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中,代码如下:

from myapp.views.main import main_bp

app.register_blueprint(main_bp)

app.add_url_rule('/', view_func=main.home)

app.add_url_rule('/results', view_func=main.results, methods=['POST', 'GET'])
当我访问索引页时,我总是收到以下错误消息:

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>

同样的错误也会发生


有人能帮忙吗?

好的,所以我看到的第一个问题是,即使您试图使用blueprint,但实际上并没有对它做任何事情

是的,在
main\u bp=Blueprint('main',\uuu name\uuu)
行中,您创建了它,但在此之后,您实际上不会为它注册任何url端点,而是尝试通过主应用程序中的导入来完成

因为您实际上没有在blueprint中注册端点,而是尝试通过调用带有blueprint“main”前缀的
main.results
来为其创建重定向,所以函数的url\u失败

这就是正确使用蓝图时代码的外观

蓝图

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\u url\u rule
(其工作原理与装饰器的工作原理完全相同),只需使用
main\u bp。在蓝图文件中添加\u url\u rule(…)

添加url规则的工作示例

蓝图文件

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)
应用程序文件

from flask import Flask
import bp

app = Flask(__name__)


app.register_blueprint(bp.main_bp)



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

好的,所以我看到的第一个问题是,即使你试图使用blueprint,你实际上并没有用它做任何事情

是的,在
main\u bp=Blueprint('main',\uuu name\uuu)
行中,您创建了它,但在此之后,您实际上不会为它注册任何url端点,而是尝试通过主应用程序中的导入来完成

因为您实际上没有在blueprint中注册端点,而是尝试通过调用带有blueprint“main”前缀的
main.results
来为其创建重定向,所以函数的url\u失败

这就是正确使用蓝图时代码的外观

蓝图

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\u url\u rule
(其工作原理与装饰器的工作原理完全相同),只需使用
main\u bp。在蓝图文件中添加\u url\u rule(…)

添加url规则的工作示例

蓝图文件

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)
应用程序文件

from flask import Flask
import bp

app = Flask(__name__)


app.register_blueprint(bp.main_bp)



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

谢谢你的分析。我想使用
main\u bp.add\u url\u rule(…)
,但代码不起作用。这是我在
main.py
中的代码:
main\u bp.add\u url\u rule('/',view\u func=home)
,我知道
view\u func=home
不正确,但我不知道什么是正确的。所以你们能纠正我的代码吗?@shitoujizu在我文章的末尾添加了带有add_url_规则的工作示例,但你们可能应该使用decorator语法,因为它更简单。如果你有任何问题,请发布错误日志。我知道了
decorator
add\u url\u rule
都适用于您的示例。你解决了我的问题。谢谢,伙计,谢谢你的分析。我想使用
main\u bp.add\u url\u rule(…)
,但代码不起作用。这是我在
main.py
中的代码:
main\u bp.add\u url\u rule('/',view\u func=home)
,我知道
view\u func=home
不正确,但我不知道什么是正确的。所以你们能纠正我的代码吗?@shitoujizu在我文章的末尾添加了带有add_url_规则的工作示例,但你们可能应该使用decorator语法,因为它更简单。如果你有任何问题,请发布错误日志。我知道了
decorator
add\u url\u rule
都适用于您的示例。你解决了我的问题。谢谢,伙计。