我从带有蓝图的 Flask 应用程序中收到 404 错误。这是在运行最新 PyCharm 和 python 3.11 的 Windows 10 上。
我见过这个问题的几个版本,通常是很多年前的版本。我有一个 Flask 应用程序尚未完成,但在早期开发中“正常工作”。我被安排进行一系列其他项目,现在又回到了 Flask 应用程序。我更新了 python、Flask 及其依赖项。
当我在 PyCharm 调试器中启动应用程序时,它会运行并显示预期的启动信息:
FLASK_APP = my_app/my_app.py
FLASK_ENV = development
FLASK_DEBUG = 0
In folder C:/Users/ME/PycharmProjects/Project_folder
import sys; print('Python %s on %s' % (sys.version, sys.platform))
C:\Users\ME\PycharmProjects\Project_folder\venv\Scripts\python.exe C:/JetBrains/PyCharm-2023.2.1/plugins/python/helpers/pydev/pydevd.py --module --multiprocess --qt-support=auto --client 127.0.0.1 --port 50785 --file flask run
Connected to pydev debugger (build 232.9559.58)
[2023-09-29 14:31:12,134] INFO in my_app: STARTING APP
* Serving Flask app 'my_app/my_app.py'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
我的项目布局——为简洁起见进行了编辑
:.
| my_app.py
| CONFIG.ini
| requirements.txt
+---app
| | local_settings.py
| | settings.py
| | __init__.py
| +---models
| +---static
| +---templates
| +---views
| | | admin.py
| | | API.py
| | | main.py
| | | utilities.py
| | | __init__.py
我在以下位置定义蓝图:
admin.py
、API.py
和main.py
。管理和 API 部分目前只是存根。
my_app.py
看起来像:
from app import create_app
my_app = None
try:
my_app = create_app()
my_app.logger.info(f'STARTING APP')
except Exception as e:
msg = repr(e)
if my_app:
my_app.logger.error(f'{repr(msg)}')
print(repr(msg))
aoo/__init__.py
如下所示。注意 register_blueprints(app)
中的 create_app()
调用;它来自下面的app/utilities.py
。它正在注册蓝图,因为我可以在函数调用后放置一个断点,并在 app
对象中查看它们以及规则。
import os
from dotenv import load_dotenv
from flask import Flask
from flask_mail import Mail
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from flask_user import UserManager
from flask_wtf.csrf import CSRFProtect
from app.models.user import User, UserRegisterForm, UserProfileForm, UserLoginForm
from app.views.utilities import register_api, register_blueprints
# Instantiate Flask
app = Flask(__name__)
csrf_protect = CSRFProtect()
mail = Mail()
db = SQLAlchemy()
migrate = Migrate()
user_manager = None
def create_app():
try:
load_dotenv()
app.config.from_object("app.settings")
app.config.from_object("app.local_settings")
# Set up an error-logger to send emails to app.config.ADMINS
init_file_error_handler(app)
init_email_error_handler(app)
csrf_protect.init_app(app)
mail.init_app(app)
db.init_app(app)
migrate.init_app(app, db)
# Setup Flask-User
global user_manager
user_manager = UserManager(app, db, User)
user_manager.RegisterFormClass = UserRegisterForm
user_manager.EditUserProfileFormClass = UserProfileForm
user_manager.LoginFormClass = UserLoginForm
register_blueprints(app)
return app
except Exception as e:
print(repr(e))
raise e
@app.context_processor
def context_processor():
return dict(user_manager=user_manager)
def init_file_error_handler(my_app):
...
def init_email_error_handler(my_app):
...
utilities.py
:
from app.views.API import API_blueprint
from app.views.admin import admin_blueprint
from app.views.main import main_blueprint
def register_blueprints(my_app):
try:
my_app.register_blueprint(main_blueprint)
my_app.register_blueprint(admin_blueprint)
my_app.register_blueprint(API_blueprint)
except Exception as e:
raise
def register_api(my_app, view, endpoint, url, pk="id", pk_type="uuid"):
...
main.py
有基本的主页和其他东西:
import os
import random
from datetime import timedelta
from flask import redirect, render_template, session
from flask import request, url_for, Blueprint
from flask_user import current_user, login_required
main_blueprint = Blueprint("main", __name__, template_folder="templates")
# The Home page is accessible to anyone
@main_blueprint.route("/")
def home_page():
from app import app
...
return render_template("main/home_page.html")
PyCharm 调试器启动;我可以在
create_app()
中拨打 my_app.py
电话;跳过创建步骤并检查 my_app
对象,据我所知,它似乎已正确填充,而无需成为此类事情的专家。
单击 PyCharm 调试窗口中的 URL 将打开浏览器,但报告 404 错误。据我所知,没有抛出其他错误。
想法?
小修改 FLASK_DEBUG 应该在上面设置为 0。
更新 我刚刚了解了
flask routes
命令。在调试器中,我可以看到蓝图已添加,但是当我运行 routs 命令时,我几乎什么也没得到:
> flask --app .\my_app\app routes
Endpoint Methods Rule
-------- ------- -----------------------
static GET /static/<path:filename>
于是,又开始路由了。我正在运行 python 3.11.6、最新的 Flask 和 Flask-Login。我想说我知道“the”答案,但我偶然发现 Werkzberg 在 2.3 和 3.0 版本之间贬值了一些内部组件。贬值的东西在 3.0 中被删除了——这破坏了 Flaks-Login。将 Werkzberg 回滚到 2.3 似乎有所帮助。仅供参考