繁体   English   中英

当我添加身份验证时,为什么在我的 Flask 应用程序中收到 Werkzeug BuildError?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM