前言:本文是学习网易微专业的《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
:引入flask
的session
模块
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