29、Flask實戰第29天:cms用戶名渲染和註銷功能實現
這節來完成用戶名渲染和註銷的功能,目前用戶名在前端頁面是寫死的,我們需要動態的展示出來
用戶名渲染
實現用戶名動態展示,其中一種方法就是在視圖函數,根據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用戶名渲染和註銷功能實現