当我在应用程序上注册用户时,会创建一个数据集,其中包括“_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()
尝试将
你肯定想要:
user_data = db.users.find_one({ '_id': user_id })