day45-Django视图
2018-11-30 本文已影响0人
xdxh
一、cookie和session
1.cookie
HTTP 协议是无状态的。因此,若不借助其他手段,远程的服务器就无法知道以前和客户端做了哪些通信。Cookie 就是「其他手段」之一。 Cookie 一个典型的应用场景,就是用于记录用户在网站上的登录状态。
2.cookie方法
#1.设置cookie
response.set_cookie(key, value, max_age=None)
#2.获取cookie
reqeust.COOKIES.get(key)
#3.删除cookie
request.delete_cookie(key)
注意:cookie不能跨浏览器
3.session
session:服务端会话技术,依赖于cookie。
会话技术,比如在做登录功能的时候,需要配合使用存储在客户端的cookie信息,以及存储在服务端的session来实现登录功能。 在cookie中保存了用户的信息,特别是一个特殊的令牌(token)信息,当用户拿着这个特殊的令牌来访问网站的时候,网站会从cookie中 获取这个特殊令牌去数据库session中去查询是否有这个对应的令牌的信息,如果有则验证成功,就可以把用户的信息返回给客户端 了,如果验证失败则提示用户没有登录等提示信息。
4.request对象
COOKIES:传递客户端的cookie内容
GET:获取GET请求中传递的参数
POST:获取POST请求中传递的参数
FILES:获取页面中传递的图片文件
path: 获取当前请求的URL路径
二、设置和获取cookie
1.修改urls.py配置文件
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index),
url(r'^get_token/', views.get_token),
]
2.设置cookie
def index(request):
res = HttpResponse('hello')
res.set_cookie('token', '123123', 6000)
return res
]
3.获取cookie
method:获取请求方式
def get_token(request):
if request.method == 'GET':
token = request.COOKIES.get('token')
return HttpResponse('获取令牌')
三、注册功能
1.修改urls.py配置文件
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 登录
url(r'^login/', views.login),
# 注册
url(r'^register/', views.register),
# 首页
url(r'my_index/', views.my_index),
]
2.注册功能代码
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')
re_password = request.POST.get('re_password')
# 2.判断用户名是否为空和是否已经被注册过
if not username:
# 用户名为空
err_name = '用户名不能为空!'
return render(request, 'register.html', {'err_name': err_name})
user = MyUser.objects.filter(username=username).first()
if user:
# 已经存在该账号
err_name = '该账号已被注册,请换一个账号注册!'
return render(request, 'register.html', {'err_name': err_name})
# 3.判断密码和确认密码是否相同
if password and re_password:
if password != re_password:
err_pwd = '密码和确认密码不一致,请重新注册!'
data = {
'err_pwd': err_pwd
}
return render(request, 'register.html', data)
else:
err_pwd = '密码不能为空!'
return render(request, 'register.html', {'err_pwd': err_pwd})
# 4.如果用户名不存在,且密码和确认密码相同,则实现注册,保存数据
MyUser.objects.create(username=username, password=password)
success = '注册成功!'
# 实现跳转到登录页面
return HttpResponseRedirect('/login/')
四、登录功能
1.产生随机令牌
import random
def get_cookie_token():
s = '1234567890qwertyuiopasdfghjklzxcvbnm'
token = ''
for _ in range(20):
token += random.choice(s)
return token
2.登录功能代码
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.登录操作
res = HttpResponseRedirect('/my_index/')
token = get_cookie_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
def my_index(request):
if request.method == 'GET':
# 判断token是否有效
token = request.COOKIES.get('token')
token_user = TokenUser.objects.filter(token=token).first()
if token_user:
return render(request, 'index.html')
else:
return HttpResponseRedirect('/login/')