2017-06-22 30 views
1

我想弄清楚一種方法來存儲每個用戶在網站上的建議,這樣當用戶登錄時,建議可以被收集一次而不需要被更新,直到用戶對新東西進行評級。在燒瓶登錄當前用戶設置屬性以供以後訪問

我認爲一個很好的方法來做到這一點將存儲在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

這是普遍使用的屬性吧:

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()邏輯的結果。

+0

這是如何解決這個問題的?與這種方法一樣,我不得不更新'推薦'函數來訪問'current_user.get_recs',這將最終重新計算這些建議。我的整個希望是在登錄時計算一次,並存儲一組可以在任何視圖之後訪問的值。 – Grr