【问题标题】:Unexplainable Flask 404 errors无法解释的 Flask 404 错误
【发布时间】:2014-06-26 18:02:10
【问题描述】:

我有一个使用 Flask 的网站。它曾经运行良好,但从最近开始,每个请求都返回 404,并且似乎找不到正确的端点。然而:

  • 在本地,该站点仍然可以运行,只是在我的 VPS 上显示了这种奇怪的行为。
  • url_for 有效,app.view_functions 也包含所有路线。
  • 然而,我一直在 VPS 上获得 404,即使是 //static/ 下的任何内容。

这是代码的一部分,显示所有内容有点多,并且并非全部相关:

#snip

from flask import Flask, render_template, abort, request, redirect, url_for, session
from flask.ext.babelex import Babel
from flask.ext import babelex

#snip

app = Flask(__name__)
app.secret_key = #snip

#snip

#just one of the routes
@app.route('/')
def about():
    return render_template('about.html')

#snip

@app.errorhandler(404)
def page_not_found(e):
    #snip
    return render_template('404.html'), 404

#snip

if __name__ == '__main__':
    app.run(debug=True)
else:
    app.config.update(
        SERVER_NAME='snip.snip.com:80',
        APPLICATION_ROOT='/',
    )

【问题讨论】:

  • 您查看过服务器日志吗?应该有一些关于那里出了什么问题的提示。
  • 我有。不幸的是,它们没有显示任何异常(除了每次访问的状态码都是 404)。
  • 那可能是访问日志,你需要查看错误日志。
  • 是的,那是访问日志。但是,错误日志中根本没有任何错误(不相关,即:一些关于 Apache 重启的通知等,但在最近的请求期间没有发生任何错误)
  • 你是如何在 VPS 中部署你的烧瓶应用程序的?您使用的是 uwsgi 还是 gunicorn?查看您的 wsgi 服务器日志,而不是 apache 日志。尽管如果您在 Apache 中使用 mod_wsgi 进行部署,错误应该在 apache 错误日志中。 Apache 中的每个虚拟主机是否有单独的错误日志?如果是这样,请确认您正在查看虚拟主机的正确错误日志。另外,apache/wsgi 配置最近有没有变化?

标签: python flask


【解决方案1】:

我有同样的问题。我有它是因为我将配置的参数SERVER_NAME更改为一个不是服务器名称的名称。

如果你有SERVER_NAME,你可以通过从配置中删除它来解决这个错误。

【讨论】:

  • 救了我!我在拥有真实 URL 后添加了它,但它无法正常工作,即使它确实与 URL 匹配。删除它,它开始工作。谢谢。
  • 我有同样的行为,到处都是 404,直到我从配置中删除 SERVER_NAME。但是,我不明白为什么这实际上会造成这种情况。有没有关于这种行为的解释或文档?
  • 我在 python 3.6 pip3 18.1 上安装了全新的烧瓶。除了用 3 行代码创建一个新的 app.py 来创建一个新的应用程序之外,我没有触及任何其他东西。它开始正常,但是当我使用控制台中的 url 时得到 404
  • 当我打印它时,它返回“None” print('server name ', app.config["SERVER_NAME"])
  • 这也解决了我的问题。已经开始要求在我的开发应用程序中使用(正确指定的)“SERVER_NAME”参数,但没有在 Staging 实例上指定它。
【解决方案2】:

我知道这是旧的,但我遇到了同样的问题。你的问题可能有很多,但我的问题是我在__init__.py 文件中注释掉了from app import views 行。它给了我同样的症状:每个需要@app.route 的端点和一个视图都以 404 响应。静态路由(.js 和 .css)很好(这是我的线索)。

【讨论】:

  • 注意:我必须将from app import views 添加到我的app/__init__.py最后一行
【解决方案3】:

有同样的问题,因为以下几行

if __name__ == '__main__':
    app.run(host='127.0.0.1', threaded=True)

在函数和装饰器之前声明。

将这些行移到文件的最底部对我有帮助。

【讨论】:

  • 谢谢!我在这件事上浪费了 45 分钟! :)
【解决方案4】:

此时已经非常老了,但我的与导入中的错误有关。我正在使用蓝图并且我有:

from app.auth import bp

而不是

from app.main import bp

我导入了错误的 bp/ 路由

【讨论】:

    【解决方案5】:

    我在 create_app 方法中定义我的 flask_restful 路由时收到此错误。我仍然不太明白为什么它不起作用,但是一旦我改变了范围/将它移到外面,如下所示,它起作用了。

    from flask import Flask
    from flask_restful import Resource
    from extensions import db, api
    from users.resources import User
    
    def create_app():
        app = Flask(__name__)
        app.config.from_object('settings')
        db.init_app(app)
        api.init_app(app)
    
        return app
    
    api.add_resource(User, '/users') 
    

    【讨论】:

      【解决方案6】:

      还要仔细检查路线。如果 some 没有以斜杠结尾,但您使用尾部斜杠调用它,flask 将返回 404。

      我在一个 来自电子邮件客户端的 url 之后出现了这个错误,该错误(我不知道为什么)在 url 后面附加一个斜杠。

      See 文档。

      【讨论】:

        【解决方案7】:

        我遇到了这个问题,就我而言,这是关于我的templates。我有一个这样的索引页面:

        <div>
            <a href="index.html">Home</a> |
            <a href="login.html">Login</a> |
            <a href="register.html">Register</a>
            <hr>
        </div>
        

        我应该使用url_for('index') 而不是index.html

        <div>
            <a href="{{ url_for('index') }}">Home</a> |
            <a href="{{ url_for('login') }}">Login</a> |
            <a href="{{ url_for('register') }}">Register</a>
            <hr>
        </div>
        

        【讨论】:

          猜你喜欢
          • 2013-11-02
          • 1970-01-01
          • 2013-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-23
          • 2019-01-19
          相关资源
          最近更新 更多