day46-cookie及session

2019-01-08  本文已影响0人  barriers

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'))
上一篇下一篇

猜你喜欢

热点阅读