@login_required not working in flask_blueprint

29 Views Asked by At

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?

0

There are 0 best solutions below