Flask 错误表示变量在分配之前已被引用

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

当我在应用程序上注册用户时,会创建一个数据集,其中包括“_id”、“first_name”、“last_name”和“password”。

@app.route("/register/", methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        email = request.form['email']
        first_name = request.form['first_name']
        last_name = request.form['last_name']
        password = request.form['password']

        hashed_password = generate_password_hash(password, method="sha256")

        user_data= {
            '_id': uuid.uuid4().hex,
            'email': email,
            'first_name': first_name,
            'last_name': last_name,
            'password': hashed_password
        }

然后我需要引用此数据集来登录用户加载器内的用户。

@login_manager.user_loader
def load_user(user_id):
    user_data = db.users.find_one({ '_id': user_data['_id'] })
    if user_data:
        return User(user_id = user_data['_id'], email = user_data['email'])
    return None

运行应用程序并尝试登录时出现此错误:

line 75, in load_user
    user_data = db.users.find_one({ '_id': user_data['_id'] })
UnboundLocalError: local variable 'user_data' referenced before assignment

如何存储这些注册数据以供用户加载器使用?以下是完整代码供参考:

from flask import Flask, url_for, render_template, session, redirect, flash, request, jsonify
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
import pymongo
from pymongo import MongoClient
from werkzeug.security import generate_password_hash, check_password_hash
import uuid

app = Flask(__name__)
app.secret_key = ""

#**************************************************Database*****************************************************************
client = pymongo.MongoClient('localhost', 27017)
db = client.user_login_system
app.config["MONGO_URI"] = ""
login_manager = LoginManager(app)
login_manager.login_view = 'login'

#**************************************************User Stuff*****************************************************************
class User(UserMixin):

    def __init__(self, user_id, email):
        self.id = user_id
        self.email = email
    
    def is_authenticated(self):
        True

    def is_active(self):
        True

    def is_anonymous(self):
        False

    def get_id(self):
        return str(user_id)

#**************************************************Routes*****************************************************************

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

@app.route("/register/", methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        email = request.form['email']
        first_name = request.form['first_name']
        last_name = request.form['last_name']
        password = request.form['password']

        hashed_password = generate_password_hash(password, method="sha256")

        user_data= {
            '_id': uuid.uuid4().hex,
            'email': email,
            'first_name': first_name,
            'last_name': last_name,
            'password': hashed_password
        }
        if db.users.find_one({ "email": user_data['email'] }):
            return jsonify({ "error": "Email address already in use." })
        result = db.users.insert_one(user_data)
        if result.inserted_id:
            return redirect(url_for('login'))
    return render_template("register.html")

@app.route("/dashboard/")
@login_required
def dashboard():
    return render_template("dashboard.html")


@login_manager.user_loader
def load_user(user_id):
    user_data = db.users.find_one({ '_id': user_data['_id'] })
    if user_data:
        return User(user_id = user_data['_id'], email = user_data['email'])
    return None

@app.route("/login/", methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        email = request.form['email']
        password = request.form['password']

        user = db.users.find_one({ 'email': email })
        if user and check_password_hash(user['password'], password):
            user_obj = User(user_id = user['_id'], email = user['email'])
            login_user(user_obj)
            return redirect(url_for("dashboard"))
    return render_template('login.html')

#**************************************************Run*****************************************************************
if __name__ == "__main__":
    app = create_app()
    app.config['DEBUG'] = True

    app.run()

尝试将 放在代码顶部来初始化变量,仍然不起作用。

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

你肯定想要:

user_data = db.users.find_one({ '_id': user_id })
© www.soinside.com 2019 - 2024. All rights reserved.