Django - Cookie&Session

Django - Cookie&Session_第1张图片
图片.png

获取cookie:

Django - Cookie&Session_第2张图片
图片.png

设置cookie:

这中设置cookie,关闭浏览器就失效了。

Django - Cookie&Session_第3张图片
图片.png

实例:

res = redirect('/index/')
res.set_cookie('username', 'liao', max_age=10)  # 10秒之后失效
return res

或者:

import datetime
current_date = datetime.datetime.utcnow()
expires_date = current_date + datetime.timedelta(seconds=10)  # 10秒之后过期
res.set_cookie('username', 'liao', expires=expires_date)

session:

Django - Cookie&Session_第4张图片
图片.png

Session依赖于Cookie,
服务端session:

request.session.get()
request.session[x] = x
request.session.clear()

配置文件中设置默认操作:

SESSION_COOKIE_NAME = "seesionid"
SESSION_COOKIE_PATH = "/"
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_SECURE = False
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_AGE = 1209600  # session的cookie失效日期
SESSION_COOKIE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得session失效。

======


一、Cookie

如果禁用cookie,那么在所有的需要登录网站,都不能使用了。
实质是:客户端浏览器上的一个文件。
类似于键值对的形式存在,像字典。

比如liao用户登录了服务器,服务器返回了一个键值对:

{ "is_login": "etrashdkjndas6ioiwdgvqjbwhkje"}

如果liao用户保留了这个字符串,存在于本地。

cookie的保存与浏览器的特点,我们可以使用这个特征来实现用户登录的功能。

示例:

设置cookie:

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    elif request.method == 'POST':

        u = request.POST.get('username')
        p = request.POST.get('pwd')

        dic = user_info.get(u)
        if not dic:
            return render(request, 'login.html')
        if dic['pwd'] == p:

            res = redirect('/index/')
            res.set_cookie('username', u)

            return res
        else:
            return render(request, 'login.html')

注意我们的res.set_cookie(),就给浏览器设置了cookie。return之后就设置了。

示例:

取的cookie:

def index(request):
    # 获取当前已经登录的用户名

    v = request.COOKIES.get('username')

    print v

    if not v:
        return redirect('/cookie/login/')

    return render(request, 'cookie/index.html', {'current_user':v})

上面两个例子,实现了用户验证。
登录成功,set cookie,然后再判断cookie是否存在。

1)获取cookie:

request.COOKIES.get('username')
request.COOKIES['username']

2)设置cookie的时候需要注意:
返回的时候,需要设置cookie:

    response = request.POST.get('username')
    response.set_cookie('key', 'value')
    return response

注意,这里是服务端的写入。

3)注销的时候,清除掉cookie:
我们设置过期时间为当前时间,就清除了。

res.set_cookie('key', 'value', max_age=0)

如果按照上面的方式,关闭浏览器,再开启浏览器cookie就会失效。

Cookie实现用户登录

cookie的用法:

1)设置cookie过期时间
方式一:

response = reidrect('/cookie/index/')
response.set_cookie('key', 'value', max_age=10)  # 过期时间为10秒
return response

方式二:

import datetime
            current_date = datetime.datetime.utcnow()

            #res.set_cookie('username', u, max_age=4)
            res.set_cookie('username', u, expires=current_date + datetime.timedelta(seconds=10)) # 10秒之后过期

            return res

2)设置生效的路径:path

比如分页的时候,分页的cookie生效路径只能是那里。

3)设置生效的域名:domain

4)设置只能是httponly的情况:

稍微安全一点点。

res.set_cookie('user_type', 'asdqwe', httponly=True)
Django - Cookie&Session_第5张图片
图片.png

5)在客户端读写cookie。
对比上面的服务端的读写cookie。

实例,通过js实现写cookie。
jquery的插件jquery.cookie.js.

6)js中设置cookie的path。
那么此cookie只能在这个path中使用。

   function change_page_size(ths){
        var v = $(ths).val();   // 这个$(this)是拥有此方法的html元素
        $.cookie('per_page_size', v, {'path':'/cookie/user_list/'});  // 设置cookie

        location.reload();  // 重新刷新页面
    }

7)设置带签名的cookie

服务端设置带签名的cookie,加盐。

res = HttpResponse('xxx')
res.set_signed_cookie('username', 'liao' , salt=‘asdasa’)

# 取出加盐后的cookie
request.get_signed_cookie('username', salt='asdasa')

Session

引子:基于Cookie做用户验证的时候,敏感信息最好不要放在Cookie中。

Session原理:是保存在服务器端的键值对。

Django - Cookie&Session_第6张图片
图片.png

注意:要使用session,必须先做以下的步骤创建django_sesseion表:

python manage.py makemigrations 
python manage.py migrate

示例:

# 服务端设置session

def login1(request):
    if request.method == 'GET':
        return render(request, 'cookie/login1.html')
    elif request.method == 'POST':

        username = request.POST.get('username')
        pwd = request.POST.get('pwd')

        print ('username:'+username, 'pwd:'+pwd)

        if username == 'root' and pwd == '123':

            # 生成随机字符串
            # 携带到用户浏览器cookie
            # 保存到session中
            # 在随机字符串的字典中设置相关内容

            request.session['username'] = username # 上面的四件事情,这一句就做了
            request.session['is_login'] = True

            return redirect('/cookie/index1/')
        else:
            return render(request, 'cookie/login1.html')


# 服务端取得session

def index1(request):

    if request.session.get('is_login', None) == True:
        return HttpResponse('index1')
    else:
        return HttpResponse('you did not login')

我们可以看到Cookie中有一个sessionid,说明session依赖于cookie:

Django - Cookie&Session_第7张图片
图片.png

操作session比操作cookie简单多了,因为django已经帮我们做了很多事情。

session的操作:

request.session['key'] = value  # 设置
request.session.get('key', None)  # 取得session
request.session.setdefault('k1', 123)  # 存在则不设置
del request.session['key']  # 删除session

# 所有的键、值、键值对
request.session.keys()
request.session.values()
request.session.items()  # 键值对
request.session.iterkeys()

# 用户session的随机字符串
reques.session.session_key  

# 将所有session失效日期小于当前日期的数据删除
request.session.clear_expired()  

# 检查 用户session的随机字符串 在数据库中是否存在
request.session.exists("session_key")

# 删除session
1. request.session.delete("session_key")  # 删除此用户所有session
2.del request.session['k1']  # 删除session中的k1对应的item
3.request.session.clear()  # 效果和1相同,不过更加简单。在注销的时候使用。

# 设置失效时间
request.session.set_expiry(value)
如果value是个证书,session会在这些秒数之后失效。
如果value是个datatime或者timedelta,session就会在这个时间后失效
如果value是0,那么用户关闭浏览器session就会失效
如果value是None,session会依赖全局session失效策略

eg: 
request.session.set_expiry(60*60)  # 设置保存一个小时


模板中使用session:
可以有2种方式,第一是views.py传递过来,第二是从request.session中取出



welcome {{ username }}! 
{{ request.session.username }}

session与cookie

settings.py中的配置:

Django - Cookie&Session_第8张图片
图片.png

这些是默认值,配置文件中没有写的话,就默认是这些。
但是注意,一般会将:

SESSION_SAVE_EVERY_REQUEST = True

每次请求,都会向后推迟过期时间。

SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 这个是默认的配置,说明将session存于数据库

如果你想要将session放到缓存中,只需要改为:

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'  # 使用的缓存别名,也可以是memcache

有三种缓存的方式:
1)数据库db
2)缓存 memcache
3)文件级别 file

SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = os.path.join(BASE_DIR, 'cache') # 在根目录新建一个cache目录

4)缓存+数据库Session

django内部不支持redis,只支持MemcachedCache.


经验

1.注意:
session存在于服务器里面,前端是获取不到的。

你可能感兴趣的:(Django - Cookie&Session)