2017-06-22 2 views
1

ウェブサイトに各ユーザーの推奨事項を保存する方法を見つけようとしています。ユーザーがログオンすると、ユーザーが新しい何かを評価するまで更新されます。フラスコに属性を設定すると、後でアクセスするために現在のユーザーになります

これを行ううれしい方法は、Userクラスに推奨事項を保存することだと思っていましたが、この属性に後でアクセスしようとすると値がなくなっているようです。この問題を複雑にするために、私はそれを見て、current_userアドレスの変更を表示することがわかりました。

例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オブジェクトの属性を1つのビューで設定することはできず、別のビューで使用できるように見えます。

質問:彼らは他のビューにアクセス可能であるように

ビュー内current_userオブジェクトの属性値を設定する方法はあり、?

答えて

0

それはそれのためにプロパティを使用するのが一般的です:

class User(UserMixin): 
    def __init__(self, user_doc): 
     self.username = user_doc['Username'] 

    @property 
    def recommendations(self): 
     return do_some_stuff() 

その後current_user.recommendationsdo_some_stuff()ロジックの結果を返します。

+0

これはどのように問題を回避しますか?このアプローチと同様に 'recommend'関数を更新して' current_user.get_recs'にアクセスしなければなりません。私の全面的な希望は、ログイン時にそれらを一度計算し、後でどのビューからでもアクセスできる値の配列を保存することです。 – Grr

関連する問題