flask_login 中的 login_required 装饰器未重定向到上一页

Posted

技术标签:

【中文标题】flask_login 中的 login_required 装饰器未重定向到上一页【英文标题】:login_required decorator from flask_login not redirecting to previous page 【发布时间】:2014-06-02 12:23:43 【问题描述】:

我正在使用 flask_login 登录和注销应用程序,但重定向回上一页似乎不起作用。我正在使用 flask.views 和 login_required 作为需要用户登录的视图的装饰器。但是,当我尝试访问需要登录的 /path 时,它会重定向到 /login 而不是 /login?next=/path,这意味着 request.get.args("next") 是 None。

我在蓝图中使用烧瓶视图所需的登录,如下所示:

from flask import Blueprint, render_template, request, redirect, url_for
from flask.views import MethodView
from models import Post
from flask.ext.mongoengine.wtf import model_form
from flask.ext.login import login_required

posts_app = Blueprint('posts_app', __name__, template_folder='templates', static_folder='static', static_url_path='/static')

class ListView(MethodView):
    decorators = [login_required]

    def get(self):
        posts = Post.objects.all()
        print posts
        return render_template('posts/list.html', posts=posts)

posts_app.add_url_rule('/', view_func=ListView.as_view('list'))

在一个单独的蓝图中,我正在实施身份验证:

from flask import Blueprint, render_template, request, current_app, flash, redirect, url_for
from forms import LoginForm, RegisterForm, ForgotForm
from libs.User import User
from flask.ext.login import login_user, login_required, logout_user, confirm_login
from app import login_manager, flask_bcrypt

auth_login = Blueprint('auth_login', __name__, template_folder='templates')

@auth_login.route('/login', methods=["GET", "POST"])
def login():

    if request.method == "POST" and "email" in request.form:
        email = request.form["email"]
        userObj = User()
        user = userObj.get_by_email_w_password(email)
        if user and user.is_active() and flask_bcrypt.check_password_hash(user.password, request.form["password"]):
            remember = request.form.get("remember", "no") == "yes"

            if login_user(user, remember=remember):
                flash("Logged In!")
                return redirect(request.args.get('next') or url_for('index'))
            else:
                flash("Unable to log you in")

    form = LoginForm(request.form)
    return render_template('forms/login.html', form=form)

任何熟悉登录所需装饰器的人都可以提供一些建议吗?谢谢!

【问题讨论】:

【参考方案1】:

发现出了什么问题。在我的身份验证蓝图中,我将 @login_manager.unauthorized_handler 覆盖为

@login_manager.unauthorized_handler
def unauthorized_callback():
    return redirect('/login')

而我确实需要这样做:

@login_manager.unauthorized_handler
def unauthorized_callback():
    return redirect('/login?next=' + request.path)

【讨论】:

【参考方案2】:

我所做的是这样的。

@app.after_request
def redirect_to_signin(response):
    if response.status_code == 401:
        return redirect(APP_HOST + '/auth/signin?next=' + request.url)

然后,只要用户无法通过身份验证,它就会将他们重定向到登录页面,然后准确地回到他们所在的位置。如果您有不同的主机名(即 app.website.com 和 website.com),那就太好了。在此SO answer 中查看其他request url 字段

【讨论】:

以上是关于flask_login 中的 login_required 装饰器未重定向到上一页的主要内容,如果未能解决你的问题,请参考以下文章

Flask通过Flask_login实现用户登录

flask_login模块实现过程

flask_login 整合 pyjwt + json 简易flask框架

Django 登录检查-自动重定向到登录页

如何将装饰器应用于烧瓶中的所有蓝图 url

使用 Flask 框架写用户登录功能的Demo时碰到的各种坑——创建应用