[英]Why am I receiving Werkzeug BuildError in my Flask app when I add authentication?
有人可以帮我弄清楚为什么我在 Flask 应用程序中收到以下错误吗? werkzeug.routing.BuildError: Could not build url for endpoint 'auth.login' 我相信我的路线是正确的,但我是 Flask 的新手,我正在努力进行身份验证。 以下是代码的相关页面:header.html
<div class="header-wrapper">
<nav class="navigation">
<ul class="nav-links-header">
<li class="grey-dash">|</li>
<li><a href="{{ url_for('main.home') }}">HOME</a></li>
<li class="grey-dash">|</li>
<li><a href="{{ url_for('main.past_projects') }}">PROJECTS</a></li>
<li class="grey-dash">|</li>
<li><a href="{{ url_for('main.community') }}">COMMUNITY</a></li>
<li class="grey-dash">|</li>
<li><a href="{{ url_for('main.calendar') }}">ISSUE CALENDAR</a></li>
<li class="grey-dash">|</li>
<li><a href="{{ url_for('main.results') }}">RESULTS</a></li>
<li class="grey-dash">|</li>
<li><a href="{{ url_for('main.contact_us') }}">CONTACT US</a></li>
<li class="grey-dash">|</li>
<li class="spacer"></li>
<li class="grey-dash">|</li>
{% if not current_user.is_authenticated %}
<li class="login-link"><a href="{{ url_for('auth.login') }}">LOGIN</a></li>
<li class="grey-dash">|</li>
<li class="login-link"><a href="{{ url_for('auth.register') }}">REGISTER</a></li>
<li class="grey-dash">|</li>
{% else %}
<li class="nav-item">
<a class="nav-link" href="{{ url_for('auth.logout') }}">Logout</a>
</li>
{% endif %}
</ul>
</nav>
</div>
身份验证/routes.py
from flask import render_template, request, redirect, url_for, flash
from . import bp as app
from app.blueprints.main.models import User
from app import db
from flask_login import login_user, logout_user
from . forms import RegistrationForm
@app.route("/logout")
def logout():
logout_user()
return redirect(url_for('auth.login'))
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == "POST":
# Handle login form requests
user = User.query.filter_by(email=request.form['inputEmail']).first()
if user is None:
flash(f'User with email {request.form["inputEmail"]} does not exist.', 'danger')
elif not user.check_my_password(request.form['inputPassword']):
flash('Password is incorrect', 'danger')
else:
login_user(user)
flash("User logged in", 'success')
return redirect(url_for('main.home'))
return render_template('login.html')
else:
return render_template('login.html')
@app.route("/register", methods=["GET", "POST"])
def register():
wtform = RegistrationForm()
try:
if request.method=="POST" and wtform.validate_on_submit():
email = wtform.email.data
# Query the database for a user with the passed in email
check_user = User.query.filter_by(email=email).first()
# If they already exist, show error. Otherwise, create user.
if check_user is not None:
flash('Error, user already exists', 'danger')
else:
email = wtform.email.data
first_name = wtform.first_name.data
last_name = wtform.last_name.data
username = wtform.username.data
password = wtform.password.data
city = wtform.city.data
state = wtform.state.data
if request.form['inputPassword']:
new_user = User(
email=request.form['inputEmail'],
password='',
username=request.form['inputUsername'],
first_name=request.form['inputFirstName'],
last_name=request.form['inputLastName'],
city=request.form['inputCity'],
state=request.form['inputState'],
)
new_user.hash_my_password(request.form['inputPassword'])
db.session.add(new_user)
db.session.commit()
flash('User created successfully, please login', 'success')
return redirect(url_for('auth.login'))
else:
flash('Error, please try again', 'danger')
elif request.method == 'POST':
flash('Form data not valid', 'danger')
else:
return render_template('register.html', form=wtform)
except:
flash('Invalid Form Data: Please check your form')
# raise Exception('Invalid Form Data: Please check your form')
return render_template('register.html', form=wtform)
登录.html
{% extends './layout.html' %}
{% block content %}
<div class="container">
<h1>Login</h1>
<form action="/auth/login" method="POST">
<div class="form-group">
<label for="inputEmail">Email address</label>
<input type="email" class="form-control" name="inputEmail" id="inputEmail" aria-describedby="emailHelp">
</div>
<div class="form-group">
<label for="inputPassword">Password</label>
<input type="password" class="form-control" name="inputPassword" id="inputPassword">
</div>
<p>Don't have an account? <a href="{{ url_for('auth.register') }}">Register Here.</a></p>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
{% endblock content %}
身份验证/init.py
bp = Blueprint('auth', __name__, url_prefix='/auth')
from . import routes
主/模型.py
from email.policy import default
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
from app import db, login_manager
from flask_login import UserMixin
user_project = db.Table('user_project',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('project_id', db.Integer, db.ForeignKey('project.id'))
)
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(100), unique=True)
username = db.Column(db.String(50))
first_name = db.Column(db.String(50))
last_name = db.Column(db.String(50))
city = db.Column(db.String(50))
state = db.Column(db.String(50))
password = db.Column(db.String(250))
date_registered = db.Column(db.DateTime, default=datetime.utcnow())
actions_completed = db.relationship('Project', secondary=user_project, backref='users_completed')
def hash_my_password(self, password):
self.password = generate_password_hash(password)
def check_my_password(self, password):
return check_password_hash(self.password, password)
def get_user(self):
return User.query.get(self.user_id)
def __repr__(self):
return f'<User: {self.username}>'
class Project(db.Model):
id = db.Column(db.Integer, primary_key=True)
target_date = db.Column(db.Date, unique=True)
problem = db.Column(db.String(250))
action = db.Column(db.String(250))
goal = db.Column(db.String(100))
resource = db.Column(db.String(250))
image_link = db.Column(db.String(250))
def __repr__(self):
return f'<Project: {self.problem}'
@login_manager.user_loader
def load_user(user_id):
return User.query.get(user_id)
api/init.py
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from config import Config
from flask_login import LoginManager
import datetime
db = SQLAlchemy()
login_manager = LoginManager()
def create_app():
app = Flask(__name__)
app.config.from_object(Config)
migrate = Migrate()
db.init_app(app)
migrate.init_app(app, db)
login_manager.init_app(app)
from app.blueprints.main import bp as main_bp
app.register_blueprint(main_bp)
# from app.blueprints.auth import bp as auth_bp
# app.register_blueprint(auth_bp)
# from app.blueprints.api import bp as api_bp
# app.register_blueprint(api_bp)
@app.context_processor
def inject_today_date():
return {'today_date': datetime.date.today()}
return app
追溯
BuildError
werkzeug.routing.BuildError: Could not build url for endpoint 'auth.login'. Did you mean 'main.home' instead?
Traceback (most recent call last)
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\virtualenv\lib\site-packages\flask\app.py", line 2091, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\virtualenv\lib\site-packages\flask\app.py", line 2076, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\virtualenv\lib\site-packages\flask\app.py", line 2073, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\virtualenv\lib\site-packages\flask\app.py", line 1519, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\virtualenv\lib\site-packages\flask\app.py", line 1517, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\virtualenv\lib\site-packages\flask\app.py", line 1503, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\app\blueprints\main\routes.py", line 16, in home
return render_template('index.html', **context)
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\virtualenv\lib\site-packages\flask\templating.py", line 154, in render_template
return _render(
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\virtualenv\lib\site-packages\flask\templating.py", line 128, in _render
rv = template.render(context)
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\virtualenv\lib\site-packages\jinja2\environment.py", line 1301, in render
self.environment.handle_exception()
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\virtualenv\lib\site-packages\jinja2\environment.py", line 936, in handle_exception
raise rewrite_traceback_stack(source=source)
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\app\templates\index.html", line 1, in top-level template code
{% extends './layout.html' %}
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\app\templates\layout.html", line 22, in top-level template code
{% include './includes/header.html' %}
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\app\templates\includes\header.html", line 20, in top-level template code
<li class="login-link"><a href="{{ url_for('auth.login') }}">LOGIN</a></li>
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\virtualenv\lib\site-packages\flask\helpers.py", line 336, in url_for
return appctx.app.handle_url_build_error(error, endpoint, values)
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\virtualenv\lib\site-packages\flask\helpers.py", line 323, in url_for
rv = url_adapter.build(
File "C:\Users\jgott\Desktop\Coding\Coding_Temple\capstone-flask\virtualenv\lib\site-packages\werkzeug\routing.py", line 2305, in build
raise BuildError(endpoint, values, method, self)
werkzeug.routing.BuildError: Could not build url for endpoint 'auth.login'. Did you mean 'main.home' instead?
啊。 出于某种原因,我在 api/init.py 文件中注释掉了以下内容
# from app.blueprints.auth import bp as auth_bp
# app.register_blueprint(auth_bp)
取消注释,问题就解决了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.