1. 程式人生 > >29、Flask實戰第29天:cms用戶名渲染和註銷功能實現

29、Flask實戰第29天:cms用戶名渲染和註銷功能實現

() __init__ 獲取用戶信息 mode use imp 是把 user 找到

技術分享圖片

這節來完成用戶名渲染和註銷的功能,目前用戶名在前端頁面是寫死的,我們需要動態的展示出來

用戶名渲染

實現用戶名動態展示,其中一種方法就是在視圖函數,根據session信息,獲取到user id,通過該id找到用戶信息,再通過模板變量傳遞到前端模板。但是這種方法不是很好。因為在其他視圖肯定也會用到用戶信息,這樣的話每個視圖函數都要有一個獲取用戶信息的過程,這樣就顯得冗余。

之前我們講過flask中有一個g對象,這個g對象可以在整個flask項目中使用,其實在模板中也可以使用。有了這個g對象,那麽我們就可以用戶信息存入到這個g對象中,這樣可以直接通過這個g對象獲取用戶信息了。

我可以定義一個before_request鉤子函數,在請求視圖函數前把用戶信息存入g, 編輯cms.views.py

...
from flask import g

@bp.before_request
def before_request():
    if config.CMS_USER_ID in session:
        user_id = session.get(config.CMS_USER_ID)
        user = CMSUser.query.get(user_id)
        if user:
            g.cms_user = user

...

這樣,我們就可以在前端模板cms_index.html通過g.cms_user.username獲取用戶名了

<li><a href="#">{{ g.cms_user.username }}<span>[超級管理員]</span></a></li>

技術分享圖片

註銷功能實現

註銷也比較簡單,就是把用戶的user id從session中移除就可以了,然後再重定向到登錄頁面即可

編輯cms.views.py,編寫一個logout視圖函數

@bp.route(/logout/)
@login_required
def logout():
    del session[config.CMS_USER_ID]
    
return redirect(url_for(cms.login))

修改cms_index.html中註銷的鏈接

<li><a href="{{ url_for(‘cms.logout‘) }}">註銷</a></li>

這樣就實現了退出登錄的功能了。

代碼優化

上面我們把鉤子函數寫了 cms.views.py文件裏面。為了規範一點, views文件我們只寫視圖,把鉤子函數單獨寫在一個文件裏面。

在cms創建一個hooks.py用來專門寫鉤子函數的,把上面 views裏面的鉤子函數剪切到cms.hooks.py

from flask import session, g
import config
from .views import bp
from .models import CMSUser

@bp.before_request
def before_request():
    if config.CMS_USER_ID in session:
        user_id = session.get(config.CMS_USER_ID)
        user = CMSUser.query.get(user_id)
        if user:
            g.cms_user = user

寫完cms.hooks.py還不夠,因為cms.hooks.py還得不到執行,得不到執行,那麽g對象就無法存入用戶信息

所以,我們只需要在cms.__init__.py導入它,那麽就可以得到執行了

from .views import bp
import apps.cms.hooks

29、Flask實戰第29天:cms用戶名渲染和註銷功能實現