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
每天进步一点,加油!