Flask 404 错误

问题描述 投票:0回答:1

我从带有蓝图的 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 flask pycharm
1个回答
0
投票

于是,又开始路由了。我正在运行 python 3.11.6、最新的 Flask 和 Flask-Login。我想说我知道“the”答案,但我偶然发现 Werkzberg 在 2.3 和 3.0 版本之间贬值了一些内部组件。贬值的东西在 3.0 中被删除了——这破坏了 Flaks-Login。将 Werkzberg 回滚到 2.3 似乎有所帮助。仅供参考

© www.soinside.com 2019 - 2024. All rights reserved.