我从Flask的Blueprints应用程序中获得404错误。这是在Windows 10上运行最新的PyCharm和python 3.11。
我已经看到了几个,通常是多年前,这个问题的版本。我有一个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
。admin和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
看起来像这样。注意create_app()
中的register_blueprints(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调试器启动;我可以在my_app.py
中中断create_app()
调用;跳过创建步骤并检查my_app
对象,据我所知,它似乎被正确填充,而不是这方面的Maven。
点击PyCharm调试窗口中的URL会弹出一个浏览器,但会报告404错误。据我所知,没有其他错误被抛出。
有什么想法?
次要编辑FLASK_DEBUG应设置为0以上。
更新我刚刚了解了flask routes
命令。在调试器中,我可以看到蓝图已经添加,但当我运行routs命令时,我几乎什么也没有得到:
> flask --app .\my_app\app routes
Endpoint Methods Rule
-------- ------- -----------------------
static GET /static/<path:filename>
1条答案
按热度按时间brqmpdu11#
所以,它又是路由。我正在运行Python 3.11.6,最新的Flask和Flask-Login。我很想说我知道答案,但我偶然发现Werkzberg在2.3和3.0版本之间贬低了它的一些内部结构。在3.0中,贬值的东西被删除了--这打破了Flaks-Login。将Werkzberg回滚到2.3似乎有所帮助。FYI