关于flask中的蓝图和路由的一个问题

今天下午的时候,我写一个ajax请求以及响应方法,类似这样:

<script type="text/javascript">
    $(function () {
        $.get("{{ url_for('blueprint.api') }}", function (data) {
           console.log(data.test);
        });
    });
    </script>
@blueprint.route('/api', methods=['GET'])
def api():
    return jsonify('test': 'success')

测试一下,我本来以为肯定不会有问题的。结果:

Failed to load resource: the server responded with a status of 404 (NOT FOUND)

为什么?
经过一番排查,最后确定是路由写的不对。
在使用蓝图的时候,写了这样的语句:

app.register_blueprint(blueprint, url_prefix='/')

问题就出在url_prefix这个参数上,将该参数去除,就能够通过测试。但是,我想到另一个情况,于是我保留了参数url_prefix,转而修改了rule

@blueprint.route('api', methods=['GET'])
def api():
    return jsonify('test': 'success')

同样通过了测试。
在使用蓝图时,可以使用url_for方法取得路径。

  1. url_prefix='/'rule='/api'时,url_for方法输出/api,请求失败(Not
    Found);
  2. url_prefix='/'rule='api'时,url_for方法输出/api,请求成功;
  3. url_prefix=Noneurl_prefix=''rule='/api'时,url_for方法输出/api,请求成功。

问题来了,为什么情况1会请求失败呢?

阅读 3.5k
1 个回答
# 路径
# from flask.blueprints import Blueprint
# 然后看下其中的这个方法
def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
  """A helper method to register a rule (and optionally a view function)
  to the application.  The endpoint is automatically prefixed with the
  blueprint's name.
  """
  if self.url_prefix:
    rule = self.url_prefix + rule
  options.setdefault('subdomain', self.subdomain)
  if endpoint is None:
    endpoint = _endpoint_from_view_func(view_func)
  defaults = self.url_defaults
  if 'defaults' in options:
    defaults = dict(defaults, **options.pop('defaults'))
  self.app.add_url_rule(rule, '%s.%s' % (self.blueprint.name, endpoint),
                        view_func, defaults=defaults, **options)
                        
# 所以你1中的路径需要访问的是 //api
# 假如 //api 访问不到的话,需要看下你是不是做了类似于 /* 的配置
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题