12.Django之cookie,session与装饰器实现用户认证

Cookie

什么是Cookie

          Cookie是浏览器的技术,Cookie是具体的一段小消息,它是服务器发送出来储存在浏览器上的一组组键值对,下次访问浏览器会携带这些键值对方便服务器提取信息,

          Cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生

Cookie的原理

          浏览器访问服务端,带着一个空的Cookie,然后由服务器产生内容,浏览器收到相应后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了

         Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session

流程图

Cookie规范

  • Cookie大小上限为4KB
  • 一个服务器最多在客户端浏览器上保存20个Cookie
  • 一个浏览器最多保存300个Cookie,因为有个浏览器可以访问多个服务器

Django中的Cookie操作

#取值
request.session['k1']
request.session.get('k1',None)
#设置值
request.session['k1'] = 123
request.session.setdefault('k1',123)
#删除值
del request.session['k1']  #django-session表里面同步删除
# 所有键值键值对
request.session.keys()
request.session.values()
request.session.items()
#会话session的key
session_key = request.session.session_key
#将有所Session失效日期小于当前日期的数据删除
request.session.clear_expired()
#检查会话session的key是否存在
request.session.exists('session_key')
#删除当前会话的所有Session数据
request.session.selete()
#删除当前会话的所有Session数据
request.session.delete()
#删除当前的会话数据并删除会话的Cookie
request.session.flush()
# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
# 如果value是整数,session就会在这些秒数后失效
# 如果value是个datatime或timedelta,session就会在这个时间后失效
# 如果value是0,用户关闭浏览器session就会失效
# 如果value是None,Session会依赖全局session失效策略

Cookie版登陆验证

views.py

from django.shortcuts import render, HttpResponse, redirect
from app01 import models
from django.urls import reverse


# Create your views here.


def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        username = request.POST.get('username')
        password = request.POST.get('pwd')

        ret_obj_list = models.UserInfo.objects.filter(name=username, password=password)
        if ret_obj_list.exists():
            request_cookies = request.COOKIES
            print('login', request_cookies)
            ret = redirect(reverse('home'))
            # ret.set_cookie('is_login',True,max_age=10)
            # ret.set_cookie('user',username,max_age=10)
            ret.set_signed_cookie('is_login', True, salt='123')
            ret.set_signed_cookie('user', username, salt='123')
            ret.set_signed_cookie('pwd', password, salt='123')
            return ret
        else:
            return redirect(reverse('login'))


from functools import wraps


def warpper(fn):
    @wraps(fn)
    def inner(request, *args, **kwargs):
        is_login = request.get_signed_cookie('is_login', False, salt='123')
        print(is_login, type(is_login))
        if is_login != 'True':
            return render(request, 'login.html', )
        else:
            return fn(request, *args, **kwargs)

    return inner


@warpper
def home(request):
    print('home', request.COOKIES)
    # is_login = request.COOKIES.get('is_login',False)
    # print(is_login,type(is_login))

    # is_login = request.get_signed_cookie('is_login',False,salt='123')
    # print(is_login,type(is_login))
    #
    # if is_login == 'True':
    #     username = request.COOKIES.get('user').split(':')[0]
    #     return render(request,'home.html',{'username':username})
    # else:
    #     return redirect(reverse('login'))
    return render(request, 'home.html')


@warpper
def index(request):
    return render(request, 'index.html')


def logout(request):
    ret = redirect(reverse('login'))
    ret.delete_cookie('is_login')
    ret.delete_cookie('user')
    ret.delete_cookie('paw')
    return ret

 urls.py

from django.contrib import admin
from app01 import views
urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^login/',views.login,name='login'),
    url(r'^index/',views.index,name='index'),
    url(r'^home/',views.home,name='home'),
    url(r'^logout/',views.logout,name='logout'),
]

 models.py

from django.db import models

# Create your models here.
class UserInfo(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16)
    password = models.CharField(max_length=16)

 home.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>home页面,欢迎--{{ username }},进入直播间</h1>
<a href="{% url 'logout' %}">退出直播间</a>
<a href="{% url 'index' %}">index页面</a>
</body>
</html>

 index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>用户中心页</h1>
<ul>
    <li>姓名</li>
    <li>年龄</li>
    <li>性别</li>
</ul>
</body>
</html>

 login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="{% url 'login' %}" method="post">
    <div>
        用户名: <input type="text" name="username">
    </div>
    <div>
        密码: <input type="password" name="pwd">
    </div>
    <div>
        <input type="submit" value="提交">
    </div>
    {% csrf_token %}
</form>
</body>
</html>

cookie存储到客户端

优点:数据存储在客户端。减轻服务端的压力,提高网站的性能

缺点:安全性不高,在客户端很容易被查看或破解用户会话信息

 Session版登陆验证

from django.shortcuts import render, HttpResponse, redirect
from app01 import models
from django.urls import reverse

# session版登陆验证

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        username = request.POST.get('username')
        password = request.POST.get('pwd')

        ret_obj_list = models.UserInfo.objects.filter(name=username, password=password)
        if ret_obj_list.exists():
            request.session['session_login'] = True
            request.session['user'] = username
            request.session['pwd'] = password

            data = {'session_login': True, 'user': username, 'pwd': password}
            return redirect(reverse('home'))
        else:
            return redirect(reverse('login'))

from functools import wraps
def warpper(fn):
    @wraps(fn)
    def inner(request, *args, **kwargs):
        is_login = request.session.get('session_login')
        print(is_login, type(is_login))
        if is_login != True:
            return render(request, 'login.html', )
        ret = fn(request, *args, **kwargs)
        print('后')
        return ret

    return inner


@warpper
def home(request):
    print('home', request.COOKIES)

    # is_login = request.session.get('session_login')
    # print(is_login,type(is_login))
    #
    # if is_login == True:
    #     username = request.session.get('user')
    #     return render(request,'home.html',{'username':username})
    # else:
    #     return redirect(reverse('login'))
    return render(request, 'home.html')


@warpper
def index(request):
    return render(request, 'index.html')


def logout(request):
    request.session.flush()

    return redirect(reverse('login'))

 Django中的Session配置

1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)

2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 

4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

其他公用设置项:
SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

 

posted @ 2019-03-07 15:31  等待の喵  阅读(216)  评论(0编辑  收藏  举报