美文网首页
day46-cookie及session

day46-cookie及session

作者: barriers | 来源:发表于2019-01-08 19:30 被阅读0次

    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'))

    相关文章

      网友评论

          本文标题:day46-cookie及session

          本文链接:https://www.haomeiwen.com/subject/vgyvrqtx.html