在flask登录当前用户中设置属性以供以后访问

时间:2017-06-22 15:57:59

标签: 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)

例子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对象设置属性值,以便其他视图可以访问它们?

2 个答案:

答案 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