我正在尝试找出一种方法来为网站上的每个用户存储推荐,这样当用户登录推荐时,可以收集一次并且不需要更新直到用户评价新内容。
我认为这样做的好方法是将建议存储在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)
例子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])
如果我登录并浏览主页,current_user.recommendations
会按预期填写。但是,如果我导航到/recommend
并在recs = get_recommendations(current_user)
之前放置一个断点,我会发现current_user.recommendations
再次是一个空列表。这是current_user
的预期行为,如果是,那么存储用户属性以防止重复计算的正确方法是什么。
提前感谢您的帮助。
显然我没有彻底解释我的问题,它似乎与How to user g user global in flask相似。但是,我读到了这个问题,实际上它并没有任何相似之处。
问题:
我的模型中等复杂,需要> 0.1秒来预测用户的所有建议。在我看来,以每次用户导航到/recommend
必须计算推荐的方式构建网站是浪费的,并且可以提供足够的请求,从而减慢服务器的速度。
解决方案:
为了避免这个问题,我认为在登录时计算建议一次,然后在添加新评级后计算建议将减少服务器需要计算的预测量,从而提高服务器的性能和加载所需的时间每个用户的推荐页面。
但是,我似乎无法在一个视图中的现有current_user
对象中设置一个属性,然后在另一个视图中可用。
问题:
有没有办法在视图中为current_user
对象设置属性值,以便其他视图可以访问它们?
答案 0 :(得分:0)
通常使用属性:
class User(UserMixin):
def __init__(self, user_doc):
self.username = user_doc['Username']
@property
def recommendations(self):
return do_some_stuff()
然后current_user.recommendations
将返回do_some_stuff()
逻辑的结果。
答案 1 :(得分:-1)
在我看来,current_user
每次都基于最初提供的id
重新加载。
如果没有以最初希望的方式解决问题,我( 作为python新手 )建议您解决问题:
from flask import session
session['data_variable_name'] = 'somedata'
然后从您需要的位置访问session
。