我怎样才能使我的 Flask 应用程序中的 Next 不设置为 None?

问题描述 投票:0回答:1

我正在使用flask-sqlaclchemy、flask-login 和flask-wtf 制作一个Flask 应用程序。

我的问题是,我第一次尝试设置登录系统,我遵循了文档,但是当尝试使用下一步时,它被设置为“无”。因此,使我的验证执行中止 400。我尝试删除下一部分并简单地在没有它的情况下继续,但随后我的应用程序不存储登录信息,即使我的登录功能验证所有数据并重定向我登录成功后看到我想要的视图,它显示一条消息,说我没有权限。

这是我的代码:

@app.route("/login", methods=["POST", "GET"])
def login():
    form = SignUpForm()
    if request.method == "POST":
        user = Blog_User()
        form.populate_obj(user)
        email_db = db.session.execute(db.select(Blog_User).filter_by(email = user.email)).scalar()
        if email_db:
            pass_db = db.session.execute(db.select(Blog_User).filter_by(password = user.password)).scalar()
            if pass_db:
                login_user(user)
                flash("Login Suscessfully!")

                next = request.args.get('next')

                if not url_is_safe(next, request.host):
                    p = url_is_safe(next, request.host)
                    return f"The next is: {next}, and the expresion evaluates to: {p}"


                return redirect(next or url_for("home"))
            else:
                flash("Your password was incorrect, try again.")
                return redirect("/login")
        else:
            flash("You dont have an account.")
            return redirect("/login")
    return render_template("user/login.html", form=form)

@login_manager.user_loader
def load_user(user_id):
    return Blog_User.query.get(user_id)

这是我的应用程序结构:

__pycache__
.venv
app
├── __pycache__
├── forms
│   ├── __pycache__
│   └── sign_up.py
├── helpers
│   ├── __pycache__
│   ├── __init__.py
│   ├── hash_password.py
│   ├── test_data.py
│   ├── test_post.py
│   ├── test_user.py
│   └── url_has_allowed_h.py
├── models
│   ├── __pycache__
│   ├── __init__.py
│   ├── posts.py
│   └── user.py
static
├── img
│   ├── arrow_icon.png
│   └── github-social.png
├── index.css
├── login.css
└── sign_up.css
templates
├── user
│   ├── login.html
│   └── sign_up.html
└── index.html
__init__.py
routes.py
tes.py
instance
├── config.py
└── database_tut.db
.gitignore
config.py
README.md
requirements.txt
run.py

我真的不知道为什么需要 next 以及它如何处理这些事情,只是那有点像迭代器中的下一个参数或类似的东西。

python flask flask-login
1个回答
0
投票

URL 参数

next
只是一个 URL,如果用户之前尝试过未经身份验证访问安全区域,则在完成登录后应将用户定向到该 URL。使用此参数并不是登录正常工作的必要条件。
据我了解,如果登录不起作用,这似乎是由于代码中的另一个错误造成的。不幸的是,您没有在问题中包含数据库模型、表单和模板,或
LoginManager
的初始化。这意味着错误也可能发生在其他地方。
但是,值得注意的是,您发布的代码需要优化,并且使用不属于数据库一部分的
login(...)
用户对象。这可能是session创建不正确,重定向后找不到用户的原因。

另一方面,下面的简化示例使用来自数据库查询的用户,以便其标识符可以存储在会话中,并且可以在重定向后再次找到。

@app.route('/login', methods=['POST', 'GET'])
def login():
    form = SignUpForm()
    if form.validate_on_submit():
        stmt = db.select(Blog_User).filter_by(email = form.email.data)
        user = db.session.execute(stmt).scalar()
        
        # Later, use a hashing algorithm to securely store the password. 
        if user and user.password == form.password.data:
            login_user(user)
            flash('Logged in successfully.')

            next_url = request.args.get('next')
            if not url_is_safe(next_url, request.host):
                abort(400)

            return redirect(next_url or url_for('home'))

        # For security reasons, do not distinguish between 
        # incorrect username and password.
        flash('Your username or password was incorrect. Try again.')

    return render_template('user/login.html', form=form)


@login_manager.user_loader
def load_user(user_id):
    return db.session.get(Blog_User, user_id)
© www.soinside.com 2019 - 2024. All rights reserved.