Flask-login - AttributeError: 'AnonymousUserMixin' object has no attribute '_sa_instance_state'
Flask-login - AttributeError: 'AnonymousUserMixin' object has no attribute '_sa_instance_state'
我正在为 运行 匿名在线实验设置一个烧瓶应用程序。如何通过登录管理器的 current_user
对象跟踪匿名参与者?
当用户是匿名用户时,current_user
设置为 AnonymousUserMixin
。我试图为 AnonymousUserMixin
分配一个 id 变量(例如通过 uuid.uuid4() )以不具有 current_user=None
但它不再是 ORM 对象了。我尝试遵循此 post (How to track anonymous users with Flask) 的第二个答案的建议,但我缺乏如何将描述的方式转换为实际代码的知识。
所以我得到了错误消息 'AnonymousUserMixin' object has no attribute '_sa_instance_state' 我似乎无法解决。
关于如何对匿名用户使用 current_user
对象有什么建议吗?
这里是一些相关的代码部分[编辑:根据@Roch 的建议调整了代码]:
models.py
from website import db
# models for database structure
class DemographicData(db.Model):
__tablename__ = 'demographic_data'
id = db.Column(db.Integer, primary_key=True)
gender = db.Column(db.String(1), nullable=False)
age = db.Column(db.Integer, nullable=False)
nationality = db.Column(db.String(50), nullable=False)
# create relationships to the other models to link them to the demographicData
consentRequest = db.relationship('ModalData', backref='participant_bref', lazy=True)
def __repr__(self):
return f"demographicData('{self.id}', '{self.gender}', '{self.age}', '{self.nationality}')"
class ModalData(db.Model):
__tablename__ = 'modal_data'
id = db.Column(db.Integer, primary_key=True)
participantId = db.Column(db.Integer, db.ForeignKey('demographic_data.id'), nullable=False)
consent = db.Column(db.String(3), nullable=False)
def __repr__(self):
return f"modalData('{self.participantId}', '{self.consent}')"
routes.py
from flask import render_template, url_for, redirect, request, session
from website import app, db
from website.models import DemographicData, ModalData
from website.questionnaires import DemographicsForm
@app.before_request
def make_session_permanent():
session.permanent = True
# route to demographic information form
@app.route("/demographics", methods=['GET', 'POST'])
def demographics():
form = DemographicsForm()
if form.validate_on_submit():
participant = DemographicData(gender=form.gender.data,
age=form.age.data,
nationality=form.nationality.data)
session['anonymous_user_id'] = participant.id
# save to database
db.session.add(participant)
db.session.commit()
return redirect(url_for('megazine'))
return render_template('demographics.html', title='Demographic Information', form=form)
# route to a website I want to redirect to after demographics
@app.route("/megazine", methods=['GET', 'POST'])
def megazine():
if request.method == 'POST':
consentDecision = ModalData(participant_bref=session['anonymous_user_id'],
consent=request.form['consentForm'])
db.session.add(consentDecision)
db.session.commit()
return redirect(url_for('motivemag'))
return render_template('/newswebsite_templates/megazine/index.html', title='Megazine')
您想在会话期间或会话后跟踪用户吗?
如果您需要在匿名用户使用您的应用程序期间保留一些数据,您可以轻松地使用 Flask 会话:http://flask.pocoo.org/docs/1.0/api/#flask.session
from flask import session
@app.route('/my_url1')
def my_view1():
data = None
if session.new:
# ... do something like save data in the session
session['foo'] = 'bar'
# ... do something like read data in the session
data = session['foo']
return render_template('/my_template.html', data=data)
如果你想在会话结束后保留用户的数据,我认为合乎逻辑的做法是动态创建一个用户并记录他。
from flask import session
from models import User
@app.route('/my_url1')
def my_view1():
data = None
if session.new:
user = User()
session['anonymous_user_id'] = user.id
else:
user = User.query.get(session['anonymous_user_id'])
# ... do whatever you like
我正在为 运行 匿名在线实验设置一个烧瓶应用程序。如何通过登录管理器的 current_user
对象跟踪匿名参与者?
当用户是匿名用户时,current_user
设置为 AnonymousUserMixin
。我试图为 AnonymousUserMixin
分配一个 id 变量(例如通过 uuid.uuid4() )以不具有 current_user=None
但它不再是 ORM 对象了。我尝试遵循此 post (How to track anonymous users with Flask) 的第二个答案的建议,但我缺乏如何将描述的方式转换为实际代码的知识。
所以我得到了错误消息 'AnonymousUserMixin' object has no attribute '_sa_instance_state' 我似乎无法解决。
关于如何对匿名用户使用 current_user
对象有什么建议吗?
这里是一些相关的代码部分[编辑:根据@Roch 的建议调整了代码]:
models.py
from website import db
# models for database structure
class DemographicData(db.Model):
__tablename__ = 'demographic_data'
id = db.Column(db.Integer, primary_key=True)
gender = db.Column(db.String(1), nullable=False)
age = db.Column(db.Integer, nullable=False)
nationality = db.Column(db.String(50), nullable=False)
# create relationships to the other models to link them to the demographicData
consentRequest = db.relationship('ModalData', backref='participant_bref', lazy=True)
def __repr__(self):
return f"demographicData('{self.id}', '{self.gender}', '{self.age}', '{self.nationality}')"
class ModalData(db.Model):
__tablename__ = 'modal_data'
id = db.Column(db.Integer, primary_key=True)
participantId = db.Column(db.Integer, db.ForeignKey('demographic_data.id'), nullable=False)
consent = db.Column(db.String(3), nullable=False)
def __repr__(self):
return f"modalData('{self.participantId}', '{self.consent}')"
routes.py
from flask import render_template, url_for, redirect, request, session
from website import app, db
from website.models import DemographicData, ModalData
from website.questionnaires import DemographicsForm
@app.before_request
def make_session_permanent():
session.permanent = True
# route to demographic information form
@app.route("/demographics", methods=['GET', 'POST'])
def demographics():
form = DemographicsForm()
if form.validate_on_submit():
participant = DemographicData(gender=form.gender.data,
age=form.age.data,
nationality=form.nationality.data)
session['anonymous_user_id'] = participant.id
# save to database
db.session.add(participant)
db.session.commit()
return redirect(url_for('megazine'))
return render_template('demographics.html', title='Demographic Information', form=form)
# route to a website I want to redirect to after demographics
@app.route("/megazine", methods=['GET', 'POST'])
def megazine():
if request.method == 'POST':
consentDecision = ModalData(participant_bref=session['anonymous_user_id'],
consent=request.form['consentForm'])
db.session.add(consentDecision)
db.session.commit()
return redirect(url_for('motivemag'))
return render_template('/newswebsite_templates/megazine/index.html', title='Megazine')
您想在会话期间或会话后跟踪用户吗?
如果您需要在匿名用户使用您的应用程序期间保留一些数据,您可以轻松地使用 Flask 会话:http://flask.pocoo.org/docs/1.0/api/#flask.session
from flask import session
@app.route('/my_url1')
def my_view1():
data = None
if session.new:
# ... do something like save data in the session
session['foo'] = 'bar'
# ... do something like read data in the session
data = session['foo']
return render_template('/my_template.html', data=data)
如果你想在会话结束后保留用户的数据,我认为合乎逻辑的做法是动态创建一个用户并记录他。
from flask import session
from models import User
@app.route('/my_url1')
def my_view1():
data = None
if session.new:
user = User()
session['anonymous_user_id'] = user.id
else:
user = User.query.get(session['anonymous_user_id'])
# ... do whatever you like