这节来完成用户名渲染和注销的功能,目前用户名在前端页面是写死的,我们需要动态的展示出来

用户名渲染

实现用户名动态展示,其中一种方法就是在视图函数,根据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用户名渲染和注销功能实现的更多相关文章

  1. 九十六:CMS系统之cms后台用户名渲染和注销功能

    用户名渲染,使用flask的g对象,在用户请求进来之后,触发视图函数之前,拿用户的信息,放到g对象里面 @bp.before_requestdef before_request(): "&q ...

  2. 「小程序JAVA实战」小程序我的个人信息-注销功能(42)

    转自:https://idig8.com/2018/09/06/xiaochengxujavashizhanxiaochengxuwodegerenxinxi-zhuxiaogongneng40/ 注 ...

  3. 31、Flask实战第31天:cms后台修改密码

    cms后台修改密码界面布局 先创建cms_resetpwd.html页面,继承cms_base.html {% extends 'cms/cms_base.html' %} {% block titl ...

  4. Flask实战-留言板-安装虚拟环境、使用包组织代码

    Flask实战 留言板 创建项目目录messageboard,从GreyLi的代码中把Pipfile和Pipfile.lock文件拷贝过来,这两个文件中定义了虚拟环境中需要安装的包的信息和位置,进入m ...

  5. Nginx实战之让用户通过用户名密码认证访问web站点

    1.Nginx实战之让用户通过用户名密码认证访问web站点 [root@master ~]# vim /usr/local/nginx/conf/extra/www.conf server { lis ...

  6. 25、Flask实战第25天:项目结构搭建

    创建一个虚拟环境bbs,并安装flask框架 #cmd进入DOS窗口 mkvirtualenv bbs pip install flask 在本地磁盘D新建项目目录:bbs 打开pycharm,创建f ...

  7. 12、Flask实战第12天:子域名

    什么是子域名,我们的后台管理系统, 比如cms.heboan.com.配置子域名需要用到蓝图技术: 我现在buleprints下面创建一个cms.py 蓝图 from flask import Blu ...

  8. 织梦CMS增加复制文档功能

    打开后台目录(/dede)下archives_do.php约430行下添加: /*----------------------------- //复制文档 ---------------------- ...

  9. PlugNT CMS v4.6.3 最新功能

    PlugNT CMS v4.6.3 最新功能: 弃用标签 selected="commend,stick" 改为andwhere="commend=1 and stick ...

随机推荐

  1. C11简洁之道:初始化改进

    1.  C++98/03初始化 我们先来总结一下C++98/03的各种不同的初始化情况: //普通数组 ] = {, , }; //POD(plain old data) struct A { int ...

  2. python测试rabbitmq简易实例

    生产者 import pika #coding=utf8 credentials = pika.PlainCredentials('guest', '密码') connection = pika.Bl ...

  3. HDU 1205 吃糖果 (数学)

    题目链接 Problem Description HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃 ...

  4. CSS(Cascading Style Shee)

    1.CSS是Cascading Style Sheet这个几个英文单词的缩写,翻译成中文是“层叠样式表”的意思 CSS能让网页制作者有效的定制.改善网页的效果. CSS是对HTML的补充,网页设计师曾 ...

  5. JS 本地属性与继承属性

    判断是否拥有某种属性 1.in 运算符 var obj = {name:'jack'}; alert('name' in obj); // --> true alert('toString' i ...

  6. 生成应用的快捷方式action,权限

    action:"com.android.launcher.action.INSTALL_SHORTCUT" 权限:com.android.launcher.permission.I ...

  7. Coursera在线学习---第九节(2).推荐系统

    一.基于内容的推荐系统(Content Based Recommendations) 所谓基于内容的推荐,就是知道待推荐产品的一些特征情况,将产品的这些特征作为特征变量构建模型来预测.比如,下面的电影 ...

  8. nginx 伪静态rewrite

    location正则写法 一个示例:   location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所 ...

  9. 将MongoDB安装成为Windows服务

    使用以下命令将MongoDB安装成为Windows服务.笔者的MongoDB目录为D:\Program Files\mongodb 切换到D:\Program Files\mongodb\bin> ...

  10. jquery获取元素索引值index()的例子

    如果参数是一组DOM元素或者jQuery对象,那么返回值就是传递的元素相对于原先集合的位置. 如果参数是一个选择器,那么返回值就是原先元素相对于选择器匹配元素中的位置.如果找不到匹配的元素,则返回-1 ...