DAY9 首页相关渲染以及用户退出的实现
首页用户登录相关渲染
先来解决主页右上角的显示处理,我们需要当用户登录时只显示用户的昵称和退出按钮

未登录时显示登录注册

因为只是对项目主页进行的操作,所以我们来到渲染我们主页对应的视图函数index下进行相关代码的编写
后端编写

首先还是先整理我们的思路并在视图的里创建文档注释写上对应的文字步骤
文档注释先写上我们对应视图完成的功能,这里是主页面相关渲染的完成
主页面的渲染现在还 只是进行了一小部分,所以我们只建立一个大类来写,让它不显得冗杂
这块是对用户是否登录进行相关的渲染,首先我们需要通过用户登录时写入的session值来获取用户相关信息
的查询然后再进行处理,理清后我们来进行步骤代码的编写
1.1
# 1.1从session中获取user_id
user_id = session.get("user_id") #当没有对应的键是返回结果为空
user = None #进行默认值的设置,防止数据库操作错误导致上下文里面没有变量而报错
首先从我们登录时写入的session中取值,这里取 的是用户的ID,这里我们需要注意一下取值的方式
通过.get取值来取值,当没有对应的键时是不会报错的,它返回的结果为空,是符合我们判断的要求的,
当通过session["对应的键"]来取值时,当键不存在时是会报错的。要注意。
当我们取值时首先应该考虑的是当不存在我们取的值,或者我们取值的键时会不会报错,如果报错了那么我们
的后续代码将执行不了,所以要验证取值返回的结果,然后再做相关的判断和代码的编写
user为我们保存用户信息的变量,因为我们将用户的信息变量生成上下文然后再传给前端做相关的判断,
生成上下文,就是将变量作为值存在构建的字典里,因为我们将进行查询的步骤放在了try里面,系统会默认这个数据是
存在风险的,也就是字典里对应的键不存在对应的值,所以我们需要先声明一下,设置默认值
补充
操作session就像操作python 中的字典一样,我们可以使用session[‘user’]获取值,也可以使用session. get(‘user’)获取值。
因为session就像字典一样所以,操作它的时候有两种方法:
(1)result = session[‘username’] :如果内容不存在,将会报异常
(2)result = session.get(‘username’) :如果内容不存在,将返回None(推荐用法
1.2
# 1.2利用user_id进行数据库查询,将查询到用户信息用变量进行保存
try:
user = User.query.filter_by(id=user_id).first()
except Exception as e :
current_app.logger.error(e)
abort(404)
因为我们查询用户数据会使用第三方数据库,所以需要异常捕捉,而且first() 查询器找不到对应数据时是返会None,也就是为空,不会
报错,所以是符合我们判断要求的,异常处理为写入日志且抛出404异常
1.3 除了用户变量需要生成上下文之外以后首页需要渲染的数据内容也是需要生成上下文的,放在同一个字典里面就行,用不同的键来进行保存
# 1.3生成保存用户变量的上下文并传到前台进行相关判断处理
context={
"user":user
}
return render_template("news/index.html",**context)
这里构造还是上下文,也就是字典,将用户信息作为值传给前端页面进行相关的判断,然后进行不同的渲染 。这里使用了 **表示将字典扩展为关键字参数,也就是拆包处理
现在更改一下前端主页面的代码,对接收到的user信息作为判断的条件并进行不同的渲染
HTML代码

这里使用了flask中jinja2模板引擎,通过if判断传入的user是否为空来进行用户登录状态的相关渲染并通过获取到的用户信息中nick_name字段的内容进行展示,也就是用户昵称进行展示,
这样当我们用户登录时,写入的session就会保存用户ID,前端获取到后进行有值的渲染。等我们手动删除保存到cookie中的session值时就会进入为空的渲染,也就是提示用户登录或者
注册。这样我们的代码就编写完成了,主要是通过是否存在session,并通过session获取用户信息来进行相关的判断和渲染。
用户退出
当完成相关渲染后,我们再来解决用户点击退出时,session的删除。因为我们写入session就是实现用户的状态保存,
所以退出其实是对写入的session进行删除的操作,退出是可以点击的,所以我们要创建对应的视图来进行
首先还是在passport中存放视图的views文件中加入退出的视图函数

HTML代码
这里我们指定了他的接收方式为get,并在前端的main。js里面加上相关的代码,点击退出按钮是执行的函数logout,将代码加到文件的最后就行
// 退出登录
function logout() {
// $.ajax({
// url:'/passport/logout',
// type:'get'
// });
$.get('/passport/logout', function (response) {
if (response.errno == '0') {
// 退出登录成功
location.reload();
} else {
alert(response.errmsg);
}
})
}
加入之后还需要对前端代码进行相关的改动让函数执行,单击后进行logout函数的执行

后端代码
完成之后还是在对应的视图里写入文档注释,写明实现的功能

我们这里并不需要接收数据,只是对session值进行删除操作,操作成功后再返回结果就可以了,当返回的errno == 0
时,会进行页面刷新处理,也就是从新发起请求并接收数据,完成浏览器和服务器之间新的交互,且不携带写人了session的cookie

这里不需要对从session获取到的键值是否存在进行处理,因为只有当我们用来维持状态保存的session
被写人到浏览器并发给服务器时才能够点击退出按钮,并完成相关的处理
第一步
# 1删除实现状态保持时所以写入的session
session.pop("nick_name",None) #设置键不存在时,删除的键为None,返回为None 默认值
session.pop("user_id",None)
session.pop("mobile",None)
这里将我们写入的所有的session键值对全部进行删除,需要注意的还是当键不存在时 的保存问题,这是很重要的思考点
所有我们需要先解决删除不存在的键是否会报错,经过验证是会报KeyError:的相关错误所以我们需要设置一下
通过查看pop指令传入的参数发现,第三个(default)是让我们决定是否设置默认值,它就是来解决我们删除的键不存在时
会报错的问题
这里当我们设置了当不存在时返回None ,为空,这样当键不存在时就不会保存且返回结果为空,不会报错,这样我们的问题就解决了
第二步
# 2 返回结果,并进行主页面的数据的刷新
return jsonify(errno=RET.OK,errmsg="退出成功")
这样当我们点击退出后就会出现我们的登录注册按钮,退出就完成了

完整的代码
@passport_blue.route("/logout",methods=["GET"])
def logout():
"""
用户退出功能的实现
1 删除session
2 返回json
:return:
"""
# 1删除实现状态保持时所以写入的session
session.pop("nick_name",None)
session.pop("user_id",None)
session.pop("mobile",None)
# 2 返回结果,并进行主页面的数据的刷新
return jsonify(errno=RET.OK,errmsg="退出成功")


浙公网安备 33010602011771号