Python学习笔记:6.3.3 用户登录

本文是《Python全栈工程师 - Flask高级建站》课程的学习笔记,主要探讨HTTP协议的身份验证问题及解决方案,包括Cookie和Session的使用。讲解了Cookie的写入、读取与安全问题,以及如何利用Flask内置的Session对象进行会话管理。还详细介绍了用户登录实现的步骤,如密码加密、视图保护和退出功能的实现。
摘要由CSDN通过智能技术生成

前言:本文是学习网易微专业的《python全栈工程师 - Flask高级建站》课程的笔记,欢迎学习交流。同时感谢老师们的精彩传授!

一、课程目标
  • http协议与身份验证
  • cookie
  • session
二、详情解读
2.1.http协议存在的问题

http协议中并没有对用户在多次访问之间指定身份认证规则,所以即使同一个人在同一个浏览器窗口访问同一个网站,服务器也无法知道两次访问是否是同一个人,这样就会带来身份识别的问题。
在这里插入图片描述

2.2.解决方案:cookie

现代浏览器都提供一种cookie技术,当用户访问网站的时候,可以在浏览器端记录一小段内容。每次访问的时候,在访问数据头部都会带上这一段cookie提交给服务器,这样服务器可以根据cookie来判定用户身份
在这里插入图片描述

2.2.1.cookie写入与读取

cookie对象既可以在浏览器端访问,也可以在服务器端访问。
浏览器端读取:document.cookie
服务器端写入:response.set_cookie("key", value)
服务器端读取:request.cookies.get('key')

参数 说明
key cookie键名
value 键名对应的值
expires 过期时间,默认关闭浏览器即失效
path 限制cookie有效路径,默认在全站有效
domain 设置cookie的可用域名
secure 设为true,只有https才可以使用
httponly 无法通过js获取cookie
2.2.1.cookie的安全问题

cookie对象由于可以在浏览器端通过js修改与查看,存在安全隐患,所以不能直接通过cookie来完成用户识别

2.3.解决方案:session

session会话机制
1.直接将cookie内容加密,如果加密方式暴露,两样有安全问题
2.将敏感信息存在服务器端,在浏览器存储一个加密的会话id,该id如果丢失,同样会造成安全问题。
在这里插入图片描述

2.3.1.内置session对象

内置session对象是通过将cookie内容加密传输,在服务器端,session对象使用一个密钥加密,所以使用session必须先设置密钥:

app.secret_key = "......"

通过session对象设置session键值对。比如:session['username']="luxp"

实操:
Step1:引入flasksession模块

from flask import session

Step2:设置加密密钥

app.secret_key = "123456"

Step3:添加测试session用的视图函数

@app.route('/test_session')
def test_session():
	try:
		session['number'] += 1
	except:
		session['number'] = 0
	return "number=" + str(session['number'])
2.4.3实现登录
2.4.1.用户凭借用户我与密码登录

用户登录的时候,通常会使用用户名+密码的方式登录,这就要求用户名必须唯一,否则无法识别用户身份,因此需要检查用户名是否唯一。

修改views/users.py,在register()后添加以下代码:

# 验证用户名是否重复
def validate_username(username):
	return User.query.filter_by(username=username).first()

同时,修改register()视图函数为以下内容:

@user_app.route("/register", methods=['GET', 'POST'])
def register():
	message = None
	if request.method == 'POST':
		if validate_username(request.form['username']):
			return render_template("/user/register.html", message="用户名重复")
			
		realname = request.form['name']
		username =request.form['username']
		password = request.form['password']
		sex = request.form['sex']
		mylike = '|'.join(request.form.getlist('like'))
		city = request.form['city']
		intro = request.form['intro']
		
		user = User(
			realname = realname,
			username = username,
			password = password,
			sex = sex,
			mylike = mylike,
			city = city,
			intro = intro
		)
		
		try:
            db.session.add(user
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值