I'm trying to use flask_login in a project to manage users but i get a problem when trying to verify login. When using @login_required decorator I get this error:
werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'login'. Did you mean 'admin.login' instead?
I have my views.py in a blueprint called admin:
views.py
from myproject import app, db
from myproject.models import *
from myproject.admin.forms import *
from flask_login import login_user, login_required, logout_user, current_user, current_app
admin_blueprint = Blueprint('admin',
__name__,
template_folder='templates')
@admin_blueprint.route('/')
@login_required
def home():
if current_user.is_admin() == True:
return render_template('admin/home.html')
else:
flash('Je hebt niet de priveleges om deze pagina te kunnen zien!')
return redirect(url_for('index'))
@admin_blueprint.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(email=form.email.data).first()
if user.check_password(form.password.data) and user is not None:
login_user(user)
flash('Succesvol ingelogd.')
return redirect(url_for('admin.welkom'))
return render_template('admin/login.html', form=form)
@admin_blueprint.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
user = User(email=form.email.data,
voornaam=form.voornaam.data,
achternaam=form.achternaam.data,
password=form.password.data
)
db.session.add(user)
db.session.commit()
flash('Dank voor de registratie. Er kan nu ingelogd worden! ')
return redirect(url_for('login'))
return render_template('admin/register.html', form=form)
models.py
from . import db, login_manager,app
from flask_user import UserMixin
from flask_user import UserManager
from werkzeug.security import generate_password_hash,check_password_hash
@login_manager.user_loader
def load_user(user_id):
return User.query.get(user_id)
class User(db.Model, UserMixin):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, index=True)
password_hash = db.Column(db.String(128))
voornaam = db.Column(db.String(100, collation='NOCASE'), nullable=False)
achternaam = db.Column(db.String(100, collation='NOCASE'), nullable=False)
roles = db.Column(db.String(50), default='klant')
def __init__(self, email, voornaam, achternaam, password):
self.email = email
self.voornaam = voornaam
self.achternaam = achternaam
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
def is_admin(self):
return self.roles == 'admin'
This is my HTML.
base.html
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
<title>Admin - Coupe Kiwano Hotel</title>
</head>
<body>
<ul class="nav">
<li class="nav-item">
<a class="nav-link" href="{{ url_for('admin.home') }}">Ho1me</a>
</li>
{% if current_user.is_authenticated %}
<li class="nav-link"><a href="{{ url_for('admin.logout') }}">Uitloggen</a></li>
{% else %}
<li class="nav-link"><a href="{{ url_for('admin.login') }}">Inloggen</a></li>
<li class="nav-link"><a href="{{ url_for('admin.register') }}">Registreren</a></li>
{% endif %}
</ul>
{% block content %}
{% endblock %}
</body>
</html>
home.html
{% extends "admin/base.html" %}
{% block content %}
<div class="jumbotron">
{% if current_user.is_authenticated %}
<p>Hallo {{ current_user.username }}!</p>
{% else %}
<p>Om te kunnen beginnen: log in of registreer!</p>
{% endif %}
</div>
{% endblock %}
when I enter to the login page or the register page there aren't any errors but from a page where I use @login_required I get that error. It's like flask thinks that the decorator is a url or something. I've already tried @admin.login_required and it doesn't work either! What can I do?