Django里面request提交表单

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方法提交.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值