cookie:
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
session:
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
token:
Token值介绍
token 值: 登录令牌.利用 token 值来判断用户的登录状态.类似于 MD5 加密之后的长字符串.
用户登录成功之后,在后端(服务器端)会根据用户信息生成一个唯一的值.这个值就是 token 值.
基本使用:
在服务器端(数据库)会保存这个 token 值,以后利用这个 token 值来检索对应的用户信息,并且判断用户的登录状态.
用户登录成功之后,服务器会将生成的 token 值返回给 客户端,在客户端也会保存这个 token 值.(一般可以保存在 cookie 中,也可以自己手动确定保存位置(比如偏好设置.)).
以后客户端在发送新的网络请求的时候,会默认自动附带这个 token 值(作为一个参数传递给服务器.).服务器拿到客户端传递的 token 值跟保存在 数据库中的 token 值做对比,以此来判断用户身份和登录状态.
设置cookie
set_cookie方法参数说明:
key表示设置的名称
value表示设置的值
max_age表示多少秒后过期
expires表示datetime类型的日期, 表示多久后过期
def index(request):
# 返回随机值到cookie中
res = HttpResponse('hello')
# key表示设置的名称, value表示设置的值, max_age表示多少秒后过期,
# expires表示datetime类型的日期, 表示多久后过期
res.set_cookie('token', '123123', 6000)
return res
获取token
def get_token(request):
# COOKIES:传递客户端中的cookie内容
# GET: 获取http GET请求中传递的参数。 如:127.0.0.1/xxx/?id=1&name=xxx/
# POST:获取http POST请求中传递的参数
# FILES: 获取页面中传递的图片文件
# path: 获取当前请求的URL路径
# method: 获取请求方式
if request.method == 'GET':
token = request.COOKIES.get('token')
# 做令牌是否有效的校验
return HttpResponse('获取令牌')
发送请求时的值与对应的说明
值 | 说明 |
---|---|
COOKIES | 传递客户端中的cookie内容 |
GET | 获取http GET请求中传递的参数。 如:127.0.0.1/xxx/?id=1&name=xxx/ |
POST | 获取http POST请求中传递的参数 |
FILES | 获取页面中传递的图片文件 |
path | 获取当前请求的URL路径 |
method | 获取请求方式 |
实现注册的视图函数
def register(request):
if request.method == 'GET':
# GET 访问http://127.0.0.1:8080/register/
return render(request, 'register.html')
if request.method == 'POST':
# 1.先获取注册的账号和密码和确认密码
username = request.POST.get('username')
password = request.POST.get('password')
password2 = request.POST.get('password2')
# 2.判断用户名是否已经被注册过
my_username = MyUser.objects.filter(username=username).exists()
if my_username:
print('用户名已注册')
err_name = '用户名已存在'
return render(request, 'register.html', {'err_name': err_name})
else:
print('用户名可用')
# 3.判断密码和确认密码是否为空且密码是否相同
if password and password2:
if password != password2:
print('密码不一致')
err_password = '密码不一致'
data = {
'err_password': err_password
}
return render(request, 'register.html', {'err_password': data})
else:
err_password = '密码和确认密码不能为空'
return render(request, 'register.html', {'err_password': err_password})
# 4.如果用户名不存在,且密码和确认密码相同,则实现注册,保存数据
new_user = MyUser()
new_user.username = username
new_user.password = password2
new_user.save()
return HttpResponseRedirect('/login/')
实现登录的函数
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
if request.method == 'POST':
# 1.获取登录提交的用户名和密码
username = request.POST.get('username')
password = request.POST.get('password')
# 2.查询数据库中用户名和密码对应的用户对象
user = MyUser.objects.filter(username=username, password=password).first()
if not user:
err = '用户名或者密码错误'
return render(request, 'login.html', {'err': err})
# 3.登录操作
# 给予登录成功的标识符(令牌),存在于cookie中
res = HttpResponseRedirect('/my_index/')
token = functions.create_token()
res.set_cookie('token', token, 6000)
# 向TokenUser表中加入数据
token_user = TokenUser.objects.filter(user=user).first()
if token_user:
token_user.token = token
token_user.save()
else:
TokenUser.objects.create(token=token, user=user)
# 4.跳转到首页
return res
登录后才能访问index.html页面
没有登录不让访问index.html, 而是访问login.html页面
def my_index(request):
if request.method == 'GET':
# # 登录后才能访问index.html页面
# # 没有登录不让访问index.html, 而是访问login.html页面
# token = request.COOKIES.get('token')
# if token == '123123':
# return render(request, 'index.html')
# else:
token = request.COOKIES.get('token')
# 判断token是否有效
token_user = TokenUser.objects.filter(token=token).first()
if token_user:
return render(request, 'index.html')
else:
return HttpResponseRedirect('/login/')
网友评论