Grr*_*Grr 7 python flask flask-login
我试图找出一种方法来为网站上的每个用户存储推荐,以便在用户登录时可以收集一次推荐,并且在用户对新内容进行评分之前不需要更新。
我认为这样做的一个好方法是将推荐存储在 User 类中,但是当我稍后尝试访问此属性时,这些值似乎不再存在。为了使这个问题更加复杂,我发现从查看current_user地址更改。
示例用户类:
class User(UserMixin):
def __init__(self, user_doc):
self.username = user_doc['Username']
self.userid = user_doc['User Id']
self.recommendations = []
def get_recs(self):
self.recommendations = app.config['MODEL'].predict_all(self.userid)
Run Code Online (Sandbox Code Playgroud)
示例views.py:
@APP.route('/', methods=['GET'])
def index():
"""Render the homepage."""
if current_user.is_authenticated:
if current_user.recommendations == []:
current_user.get_recs()
return render_template('index.html')
@APP.route('/recommend', methods=['POST', 'GET'])
@login_required
def recommend():
recs = get_recommendations(current_user)
return render_template('recommend.html', recs=recs[:10])
Run Code Online (Sandbox Code Playgroud)
如果我登录并浏览主页,current_user.recommendations就会按预期填写。但是,如果我然后导航到/recommend并放置一个断点,然后recs = get_recommendations(current_user)我发现它又current_user.recommendations是一个空列表。这是预期的行为current_user吗?如果是这样,存储用户属性以防止重复计算的正确方法是什么。
在此先感谢您的帮助。
显然我没有足够彻底地解释我的问题,它似乎类似于How to user g user global in flask。但是,我读到了那个问题,实际上并没有任何相似之处。
问题:
我的模型比较复杂,需要 > 0.1 s 来预测用户的所有推荐。在我看来,以每次用户导航到/recommend推荐的方式来构建网站是一种浪费,并且可能会提供足够的请求,从而降低服务器的速度。
解决方案:
为了规避这个问题,我认为在登录时计算一次推荐,然后在添加新评级后计算推荐将减少服务器需要计算的预测量,从而提高服务器的性能和加载推荐页面所需的时间对于每个用户。
但是,我似乎无法current_user在一个视图中的现有对象中设置属性,然后在另一个视图中可用。
问题:
有没有办法为current_user视图中的对象设置属性值,以便其他视图可以访问它们?
通常使用属性来实现它:
class User(UserMixin):
def __init__(self, user_doc):
self.username = user_doc['Username']
@property
def recommendations(self):
return do_some_stuff()
Run Code Online (Sandbox Code Playgroud)
然后current_user.recommendations将返回逻辑结果do_some_stuff()。