Python Flask-在开发(调试)模式下,新添加的模板导致404



我在这里学习Flask文档教程:https://flask.palletsprojects.com/en/2.1.x/tutorial/

我目前在";模板";截面(https://flask.palletsprojects.com/en/2.1.x/tutorial/templates/)在上一节中创建了Blueprint路由之后,我们创建了要使用render_template渲染的html模板文件。

到目前为止,我的项目结构是这样的:

../flask-tutorial
├── flaskr/
│   ├── __init__.py
│   ├── db.py
│   ├── schema.sql
│   ├── auth.py
│   ├── templates/
│   │   ├── base.html
│   │   ├── auth/
│   │   │   ├── login.html
│   │   │   └── register.html
├── venv/

我的__init__.py文件如下所示:

import os
from flask import Flask

def create_app(test_config=None):
# create and configure the app
app = Flask(__name__, instance_relative_config=True)
app.config.from_mapping(
SECRET_KEY='dev',
DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
)
if test_config is None:
# load the instance config, if it exists, when not testing
app.config.from_pyfile('config.py', silent=True)
else:
# load the test config if passed in
app.config.from_mapping(test_config)
# ensure the instance folder exists
try:
os.makedirs(app.instance_path)
except OSError:
pass
@app.route('/hello')
def hello():
return 'Hello, World!'
from . import db
db.init_app(app)
from . import auth
app.register_blueprint(auth.bp)
return app

这是我的auth.py文件:

import functools
from flask import (
Blueprint, flash, g, redirect, render_template, request, session, url_for
)
from werkzeug.security import check_password_hash, generate_password_hash
from flaskr.db import get_db
bp = Blueprint('auth', __name__, url_prefix='/auth')

@bp.route('/register', methods=('GET', 'POST'))
def register():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
db = get_db()
error = None
if not username:
error = 'Username is required.'
elif not password:
error = 'Password is required.'
if error is None:
try:
db.execute(
"INSERT INTO user (username, password) VALUES (?, ?)",
(username, generate_password_hash(password)),
)
db.commit()
except db.IntegrityError:
error = f"User {username} is already registered."
else:
return redirect(url_for("auth.login"))
flash(error)
return render_template('auth/register.html')

@bp.route('/login', methods=('GET', 'POST'))
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
db = get_db()
error = None
user = db.execute(
'SELECT * FROM user WHERE username = ?', (username,)
).fetchone()
if user is None:
error = 'Incorrect username.'
elif not check_password_hash(user['password'], password):
error = 'Incorrect password.'
if error is None:
session.clear()
session['user_id'] = user['id']
return redirect(url_for('index'))
flash(error)
return render_template('auth/login.html')

@bp.before_app_request
def load_logged_in_user():
user_id = session.get('user_id')
if user_id is None:
g.user = None
else:
g.user = get_db().execute(
'SELECT * FROM user WHERE id = ?', (user_id,)
).fetchone()

@bp.route('/logout')
def logout():
session.clear()
return redirect(url_for('index'))

def login_required(view):
@functools.wraps(view)
def wrapped_view(**kwargs):
if g.user is None:
return redirect(url_for('auth.login'))
return view(**kwargs)
return wrapped_view

有两件事让我感到困惑:

  1. 当我导航到我在auth.py中定义的路线时,我会收到404,即使这些路线看起来是正确的(例如http://127.0.0.1:5000/auth/register(。可以肯定的是,当我在Powershell中运行flask routes时,我可以看到它们存在于我期望的位置:
flask-tutorial> flask routes
Endpoint       Methods    Rule
-------------  ---------  -----------------------
auth.login     GET, POST  /auth/login
auth.logout    GET        /auth/logout
auth.register  GET, POST  /auth/register
hello          GET        /hello
static         GET        /static/<path:filename>

然而,当我导航到http://127.0.0.1:5000/auth/register(没有尾部斜杠(时,我得到一个404。所有/auth/..路径都会发生同样的情况。

  1. 此外,我注意到,即使我导航到基本URLhttp://127.0.0.1:5000/,函数hello也会像访问http://127.0.0.1:5000/hello一样运行。更奇怪的是,一旦我访问了http://127.0.0.1:5000/hello,我就会收到一条不同的Hello, hello!消息

我在Windows上,所以在运行我的应用程序之前,我设置了以下环境变量:

$env:FLASK_APP = 'flaskr'
...
$env:FLASK_ENV = 'development'

然后,我用flask run启动服务器,在控制台中收到以下响应:

flask-tutorial> flask run                     
* Serving Flask app 'flaskr' (lazy loading)
* Environment: development
* Debug mode: on
* Running on http://127.0.0.1:5000 (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 124-376-921

据我所知,似乎a.(我的更改没有被检测到,因为我收到的渲染结果与我用于处理某些路由的函数不匹配;b.(render_template函数没有接收到我的新模板,这导致了404错误。

如能提供任何帮助,我们将不胜感激。

编辑添加其他上下文-当我使用flask run -h localhost -p 3000指定另一个端口号(如3000(时,我会看到更新的内容。以下是Powershell的输出:

flask-tutorial> flask run -h localhost -p 3000
* Serving Flask app 'flaskr' (lazy loading)
* Environment: development
* Debug mode: on
* Running on http://localhost:3000 (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 124-376-921

这几乎就像指定额外的参数可以启用热重载,而只有flask run表示它们已启用(使用Debug mode: on(,但似乎没有?不确定为什么会出现这种情况。

原来我的质子邮件桥安装在5000端口上侦听,但由于某种原因,没有出现任何错误,表明端口已经在使用中。所以我看到的是我的代码的前一个版本。

在卸载质子邮件桥并重新启动我的计算机后,我现在可以运行flask run,并在开发模式下查看我的更新。

最新更新