from datetime import timedelta, time
from django.http import HttpResponse
from django.http import JsonResponse
from django.shortcuts import render
# Create your views here.
from App.models import User
def register(request):
if request.method=='GET':
return render(request,'register.html')
else:
data = {'status':'ok','ret':'register failed!'}
uname = request.POST.get('uname',None)
upwd = request.POST.get('upwd',None)
print(uname,upwd)
if uname and upwd:
# 对密码生成消息摘要
md5 = hashlib.md5()
md5.update(upwd.encode('utf-8'))
upwd = md5.hexdigest()
user = User()
user.uname = uname
user.upwd = upwd
user.save()
data['ret'] = 'register ok'
else:
pass
resp = JsonResponse(data)
return resp
def login(request):
# 用户第一次访问,在浏览器中输入路由,默认发起GET请求
if request.method == 'GET':
return render(request,'login.html')
# 页面中的表单依然提交到当前路由,但是方法为POST
else:
# 预定义一个最终返回的Response对象(可以动态地为其配置内容,要想勒令客户端做事情必须要有一个Response对象)
resp = HttpResponse()
# 预定义返回给用户的结果
data = {'status':'ok','ret':'login failed!'}
# 从表单中读取数据
uname = request.POST.get('uname',None)
upwd = request.POST.get('upwd',None)#str
# 对密码做消息摘要(目的是避免明文存储)
md5 = hashlib.md5()
# 对密码进行编码得到其字节对象,丢入摘要工具中
md5.update(upwd.encode('utf-8'))
# 生成十六进制字符表示的消息摘要(32位16进制数)
upwd = md5.hexdigest()
# 查询名称为uname的用户
user = User.objects.filter(uname=uname).first()
# 检查密码是否匹配
if user and upwd==user.upwd:
'''如果密码匹配,将结果信息修改为登录成功,并将用户名保存在cookie/session/token中'''
data['ret'] = 'login ok'
# # 勒令客户端(通过cookie)自己将状态保存起来,过期时间为60秒
# resp.set_cookie('uname',uname,max_age=60*1)
# # 让服务端通过session保存用户状态
# 向客户端端要session其实是要存储在cookie中的sessionid
# request.session的言下之意是"request.getSessionBySessionid"
# request.session['uname'] = uname
# request.session['upwd'] = upwd
'''
token相当于手动实现的session
session将用户状态保存在django_session的表中
token将用户状态保存在何处完全取决于程序媛自己,例如:User表
但务必使保存用户状态的这张表中有用于作为[id/key/信物]的字段(该字段必须唯一),例如:utoken
和session一样,必须在客户端的cookie中存一个相同的[id/key/信物],例如:utoken
如何获取存储的用户状态:先从cookie中拿出utoken,进而查询User表中utoken为xxx的记录,就可以拿到uname了
'''
#将用户状态保存在token中,让客户端持有一个token,将该token保存在某个表中
# 生成令牌/信物
token = str(uuid.uuid4())
# 将该令牌/信物存储在客户端的cookie中
resp.set_cookie('token',token)
# 将同样的信物存一份在服务端的表中
user.utoken = token
user.save()
# 将结果转换为字符串,丢给HttpResponse(如果是JsonResponse则无需转换)
resp.content = json.dumps(data)
return resp
def logout(request):
resp = HttpResponse()
# 勒令客户端干掉自己保存的用户状态
# resp.delete_cookie('uname')
# #删除服务端session
# # del request.session['uname']
# request.session.flush()
# 干掉token,勒令客户端删除自己的Cookie中的token
resp.delete_cookie('token')
resp.content = '登出成功!'
return resp
# 查看用户信息
def mine(request):
# # 从cookie中获取保存在客户端的用户状态
# uname = request.COOKIES.get('uname',None)
# #从服务端session获取用户状态
# uname = request.session.get('uname',None)
# # upwd = request.session.get('upwd',None)
# 从token中获取用户状态
uname = None
# 从客户端cookie中拿到令牌
utoken = request.COOKIES.get('token',None)
if utoken:
# 从服务端表中查找相同令牌的记录
user = User.objects.filter(utoken=utoken).first()
# 如果确实有匹配的用户记录,则所有用户信息(状态)都可以访问
if user:
uname = user.uname
# 如果(uname!=None)成立,则name赋值uname,否则赋值为'无名氏'
uname = uname if uname!=None else '无名氏'
return HttpResponse('hello:'+uname)
我们在提交表单时,会通过
request.method=='GET'或者是request.method=='POST'来理解
当是在网址栏直接访问网址时,就是GET方法提交网址.
当是在页面提交表单时就是POST方法提交.