day46-cookie及session
1请求方式
请求方式有get和post两种方式;
数据查询用get请求
数据操作(增、删及改操作)用post请求
1.1参数类型
传参GET:获取get请求传递的参数(request.GET['key']/request.GET.get('key'))
传参POST:获取post请求传递的参数(request.POST['key']/request.POST.get('key'))
传参FILES:获取上传的文件、图片等内容(request.FILES['key']/request.FILES.get('key'))
路径path:获取当前请求的路径(request.path)
COOKIES:存储网站的一些基本信息:如登陆的信息(request.COOKIES['key']/request.COOKIES.get('key'))
COOKIES存储的内容是存储在客户端(浏览器)
2响应response
HttpResponse:响应字符串
JsonResponse:响应json,用于ajax异步请求
render:响应页面
HttpResponseRedirect:跳转
第一种,硬编码跳转:HttpResponseRedirect('/app/index/1/')
第二种,重命名跳转:HttpResponseRedirect(reverse('user:login'))
{% block content %}
<form action="" method="post">
<p>姓名:<input type="text" name="username"></p>
<p>密码:<input type="text" name="password"></p>
<p><input type="submit" value="提交"></p>
</form>
{% endblock %}
action中写地址就提交到写的地址,如果不写,就提交到当前地址。
在测试时,先注释settings中的47行,获取权限。
2.1给路由重命名
给工程下的app路由重命名
path('app/', include(('app.urls', 'app'), namespace='new_name')),
path('user/', include(('user.urls', 'user'), namespace='user')),
给应用下的路由重命名
path('hindex/<int:id>/', views.hindex, name='new_index'),
def hindex(request):
if request.method == 'GET':
return HttpResponseRedirect(reverse('new_name:new_index', kwargs={'id': 2})) #响应跳转
elif request.method == 'POST':
pass
3登陆
3.1render和redirect的区别
render是将变量渲染到当前页面中;
而redirect是HTTP中的1个跳转的函数,一般会生成302状态码,是直接跳转到一个新的页面
return render(request, 'login.html')
return HttpResponseRedirect(reverse('user:login'))
3.2登陆
res.set_cookie('token', token, max_age=30)将变量token的值作为值赋给键token,生成一个存在时间为30秒的cookie
check_password(password,user.password),返回布尔值;用输入的密码跟数据库存储的密码进行比较是否相同
password = make_password(password) 对密码进行加密转成暗码(注册生效存入数据库时使用)
random.choice(s) 从变量s中随机取一个字符
获取登陆提交的参数:
username = request.POST.get('username')
password = request.POST.get('password')
cookie:产生背景:由于http无状态协议,导致后端无法知道当前发送请求的人是谁,用于存储一些不是很重要的内容;
存储:set_cookie(key,value,max_age/expris(存储时间秒/存储到的日期))
删除:delete_cookie(key)
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
if request.method == 'POST':
获取登陆提交的参数
username = request.POST.get('username')
password = request.POST.get('password')
user = User.objects.filter(username=username).first()
校验密码
if check_password(password, user.password):
模拟登陆成功,跳转至指定页面
res = HttpResponseRedirect(reverse('user:index'))
设置cookie
s = '0123456789abcdefg'
token = ''
for i in range(20):
token += random.choice(s) #从s中随机取字符生成cookie
res.set_cookie('token', token, max_age=30)
删除之前的cookie
UserToken.objects.filter(user_id=user.id).delete()
保存新的token到user_token表中
UserToken.objects.create(user_id=user.id, token=token)
return res
else:
登陆失败
return HttpResponseRedirect(reverse('user:login'))
4主页
从cookies中获取登陆校验的token值
token = request.COOKIES.get('token')
def index(request):
if request.method == 'GET':
从cookies中获取登陆校验的token值
token = request.COOKIES.get('token')
判断token是否存在,如果不存在说明没有登陆或登陆失效
if not token:
return HttpResponseRedirect(reverse('user:login'))
user_token = UserToken.objects.filter(token=token).first()
判断user_token表中是否存在token值,如果不存在,表示用户没有登陆
if not user_token:
return HttpResponseRedirect(reverse('user:login'))
else:
return render(request, 'index.html')
5退出
删除cookie中的键值对:res.delete_cookie('token')
def logout(request):
if request.method == 'GET':
注销(删除cookie中的键值对)
res = HttpResponseRedirect(reverse('user:login'))
res.delete_cookie('token')
return res
6注册
def register(request):
if request.method == 'GET':
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.实现保存用户信息到user表中
if User.objects.filter(username=username).exists():
msg = '账号已存在'
return render(request, 'register.html', {'msg': msg})
elif password != password2:
msg = '密码不一致'
return render(request, 'register.html', {'msg': msg})
3注册
else:
password = make_password(password) # 对密码进行加密
User.objects.create(username=username, password=password)
4跳转到登陆
return HttpResponseRedirect(reverse('user:login'))
# return render(request, 'login.html')
7用session实现登陆操作
7.1session作用
1.向cookie中保存键值对,键为sessionid(存在浏览器中)
2.向django_session表中保存sessionid值(保存在session_data中)
3.向django_session表中存键值对{'username':coco}
7.2session用法
产生背景,由于cookie中存储空间有限,很容易被截取,因此cookie存重要内容不安全,需要使用session进行数据存储
向session中存数据:request.session[key]=value
从session中取数据:request.session['key']或request.session.get('key')
删除cookie和session中的所有信息:request.session.flush()(推荐)
删除user_id中的键值对:del request.session['user_id']
def my_login(request):
if request.method == 'GET':
return render(request, 'login.html')
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = User.objects.filter(username=username).first()
if check_password(password, user.password):
向session中存数据,将user.id保存在user_id键中
request.session['user_id'] = user.id
return HttpResponseRedirect(reverse('user:hindex'))
else:
msg = '账号或者密码错误'
return render(request, 'login.html', {'msg': msg})
8用session获取当前登陆用户信息
def hindex(request):
if request.method == 'GET':
if request.session.get('user_id'): #判断user_id存在不
从session中取数据
user_id = request.session['user_id']
user = User.objects.get(pk=user_id)
print('当前登陆系统的人为:%s' % user.username)
return render(request, 'index.html')
else:
return render(request, 'login.html')
9用session退出
退出登陆可以用以下方法实现
删除cookie中的sessionid值
删除django_session表中的数据
删除django_session表中的session_data中的user_id
以上三种方法都可以实现退出操作
def my_logout(request):
if request.method == 'GET':
request.session.flush()
# del request.session['user_id']
return HttpResponseRedirect(reverse('user:my_login'))