Python Flask登录login_required重定向

马修·麦克埃尔威(Matthew McElwee)

我正在开发Flask应用程序,并使用Flask-Login进行身份验证。一切都已设置并运行。但是,当用户登录并尝试访问需要登录的页面时,他们将被重定向到登录页面。

当观看控制台时,我获得200的GET登录页面,获得200的POST登录信息,从登录​​页面到主页的302信息,然后从主页返回的另一个302的信息。

请参阅下面的代码。

from flask import (Flask, render_template, g, flash, redirect, url_for,
                    request)
from flask_bcrypt import check_password_hash
from flask_login import (LoginManager, UserMixin, login_required, login_user,
                        logout_user, current_user)

import models
import forms

application = Flask(__name__)
application.secret_key = "xxx-xxx-xxx-xxx"
login_manager = LoginManager()
login_manager.init_app(application)
login_manager.login_view = "login"

@application.before_request
def before_request():
    g.db = models.DATABASE
    g.db.connect()
    g.user = current_user

@application.after_request
def after_request(response):
    g.db.close()
    return response

@login_manager.user_loader
def load_user(email):
    try:
        return models.User.select().where(
                                models.User.email == email).get()
    except models.DoesNotExist:
        return None

@application.route("/register", methods=['GET', 'POST'])
def register():
    form = forms.RegisterForm()
    if form.validate_on_submit():
        flash("Yay! You registered!", "success")
        models.User.create_user(
            email = form.email.data,
            password = form.password.data
        )
        return redirect(url_for('home'))
    return render_template('register.html',form=form)

@application.route("/login", methods=['GET', 'POST'])
def login():
    form = forms.LoginForm()
    if form.validate_on_submit():
        next = request.args.get('next')
        try:
            user = models.User.get(models.User.email == form.email.data)
        except models.DoesNotExist:
            flash("Your email or password doesn't match!", "error")
        else:
            if check_password_hash(user.password, form.password.data):
                login_user(user, remember=True)
                flash("Welcome back!", "success")
                return redirect(next or url_for("home"))
            else:
                flash("Your email or password doesn't match!", "error")
    return render_template("login.html", form=form)

@application.route("/logout")
@login_required
def logout():
    logout_user()
    flash("You've been logged out!", "success")
    return redirect(url_for("home"))

@application.route("/")
@login_required
def home():
    return render_template("home.html")

if __name__ == "__main__":
    models.initialize()
    application.run(host='0.0.0.0')

这是模型:

import datetime

from flask_login import UserMixin
from flask_bcrypt import generate_password_hash, check_password_hash
from peewee import *

DATABASE = MySQLDatabase("fakedatabasename", host="fakehostname", user="fakeusername", password="fakepassword")


class BaseModel(Model):
    class Meta:
        database = DATABASE


class Preachers(BaseModel):
    preacher_id = PrimaryKeyField()
    preacher_first_name = CharField(max_length=27)
    preacher_last_name = CharField(max_length=27)
    preacher_email = CharField()


class Sermons(BaseModel):
    sermon_id = PrimaryKeyField()
    sermon_title = CharField(max_length=27)
    sermon_description = CharField(max_length=140)
    sermon_date = DateTimeField(default=datetime.datetime.now())
    sermon_preacher_id = IntegerField()
    sermon_video_uri = CharField(max_length=255)


class User(UserMixin,BaseModel):
    user_id = PrimaryKeyField()
    email = CharField(index=True, unique=True)
    password = CharField()
    date_created = DateTimeField(default=datetime.datetime.now())

    @classmethod
    def create_user(cls, email, password):
        try:
            cls.create(
                email = email,
                password = generate_password_hash(password)
            )
        except IntegrityError:
            raise ValueError("User already exists")


def initialize():
    DATABASE.connect()
    DATABASE.create_tables([Preachers, Sermons, User], safe=True)
    DATABASE.close()
马修·麦克埃尔威(Matthew McElwee)

因此,事实证明,在使用Peewee和Flask-Login时,您需要让Peewee为User模型提供其默认主键,而不是使用自定义键。删除user_id = PrimaryKeyField(),删除表,然后重新启动对其进行修复。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为login_required视图在重定向中调用next的默认查询字符串参数-Python Flask App

flask_login @login_required登录后继续将我重定向到登录页面

django login_required装饰器,即使登录后也始终重定向到登录页面

为什么在使用@login_required装饰器时Django为什么登录重定向过多?

Flask 如何将@login_required 重定向到特定路由?

Django @login_required'next'不正确的重定向

Python请求-SAML登录重定向

Django:Login_required(重定向到自定义 login_url)不起作用

Python Flask无尽重定向循环302

Python Flask,渲染模板后重定向

仅在成功登录(Flask Python App)后,如何将用户重定向到所需的html页面?

login_required编码下一个参数,重定向失败

Django @login_required装饰器不会重定向到特定页面

login_required 装饰器未重定向到正确的端点

将Flash消息类别添加到@login_required重定向

装饰器:flask / flask_login,使用login_required

Python(Selenium):如何使用登录重定向/组织登录登录网站

无法使用flask_login访问login_required路由

Flask登录重定向回登录页面

Flask应用程序中@login_required问题

Python输出重定向

使用Flask-Login临时覆盖来自特定重定向路由的登录消息

用户登录后 Flask-Login 重定向到 React 客户端

Flask蓝图和登录重定向的问题

python-在登录视图中内置的Django无法重定向到next

Python flask-重定向到具有查询结果的同一页

Python Flask:创建重定向到另一个网站功能

如何在Flask Python中渲染和重定向到外部URL

X秒钟后使用Flask-python / jinja等待页面重定向