第十二章 關注者(三)

2021-10-03 16:42:44 字數 3010 閱讀 2002

應用專案首頁目前按時間降序顯示資料庫中的所有文章,本節我們將在首頁新增2個導航顯示卡,分別顯示所有文章以及所關注使用者的文章。(在user類的初始化方法中,將使用者關注自身,在follower中也可以看到使用者自己發表的文章)。

顯示所關注使用者發布的所有文章,第一步顯然是要獲取這些使用者,然後獲取各使用者的文章,再按一定順序排列,寫入乙個列表。但實際上由於這種方式的伸縮性不好,我們不回去使用它。隨著資料不斷變大,生成這個列表的工作量也不斷增長,而且分頁等操作也無法高效完成。這是乙個常見的問題,稱之為"n+1"問題,比如我們關注了n個使用者,則獲取關注使用者的所有文章則需要發起n+1次查詢。

高效獲取部落格文章,而不管資料庫有多大,最好的方法是在一次查詢中完成所有操作。我們使用聯結來完成以上操作,聯結操作用到2個或多個表,在其中查詢滿足條件的記錄組合,再把記錄組合插入一張臨時表中。這個臨時表就是聯結查詢的結果。在user模型中新增followed_posts方法屬性:

class user(usermixin, db.model):

...@property

def followed_posts(self):

return post.query.join(follow, post.author_id == follow.followed_id).filter(follow.follower_id == self.id)

注:因為post和follow之間並沒有定義外來鍵,使用join聯結時必須指定關聯的條件。這裡的聯結為內聯結,也可以形象地表述為取二者的交集;

resp.set_cookie('show_followed', '', max_age=30*24*60*60) # 30天

return resp

@main.route('/followed')

@login_required

def show_followed():

resp = make_response(redirect(url_for('.index')))

resp.set_cookie('show_followed', '1', max_age=30*24*60*60) # 30天

return resp

cookie只能在響應物件物件中設定,因此這2個路由不能依賴flask,要使用make_response()方法建立響應物件。set_cookiei()函式前2個值分別為cookie名稱和值,可選的max_age引數設定cookie的過期時間,單位為秒。如果不指定max_age引數,瀏覽器關閉後cookie就會過期。

最後,在模板中新增2個導航選項卡,分別呼叫/all和/followed路由,並在會話中設定正確的值。

為了在所關注使用者的文章列表中看到使用者自己發布的文章,我們在user的__init__()方法中,使用self.follow(self)把使用者設為自己的關注者。如果資料庫中已存在一些使用者,而且沒有關注自己,正確的辦法是新增乙個函式,更新現有使用者。建立函式更新資料庫這一技術經常用來更新已部署的應用:

class user(userminxin, db.model):

@staticmethod

def add_self_follows():

for user in user.query.all():

if not user.is_following(user):

user.follow(user)

db.session.commit()

執行:

第十二章 檔案

文字檔案 文字檔案是一種由若干字元構成的檔案,可以用文字編輯器進行閱讀或編輯。以txt py html等為字尾的檔案都是文字檔案。2.二進位制檔案 二進位制檔案一般是指不能用文字編輯器閱讀或編輯的檔案。以 mp4 png等為字尾的檔案都是二進位制檔案,如果想要開啟或修改這些檔案,必須通過特定軟體進行...

第十二章 dp

動態規劃策略 將原始問題拆分為多個子問題,將子問題結果記錄,方便復用子問題的解 遞迴 記憶化 遞推 是動態規劃的一體兩面,本質都是一樣的 遞推減少了呼叫次數,空間上還能優化,一般選擇遞推方式 遞迴 記憶化 int memo maxn 將o 2 n o n intfibonacci int n 遞推 ...

第十二章 異常

一 異常的概念 錯誤 編譯器 異常 執行期,程式沒有正常按照期望執行 異常產生時,在對應位置產生異常型別物件,程式 暫停 如果上下文有異常處理程式,對應處理 沒有則 異常向上傳播 報錯退出 異常向上傳播 如果異常在函式中產生,會傳播給函式的呼叫者 如果異常在模組的頂級位置,會傳播給引用該模組的模組 ...