Django - Cookie&Session

图片.png

获取cookie:

图片.png

设置cookie:

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

图片.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:

图片.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)
图片.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原理:是保存在服务器端的键值对。

图片.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:

图片.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中取出

<body>

welcome {{ username }}! <br>

{{ request.session.username }}

</body>

session与cookie

settings.py中的配置:

图片.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存在于服务器里面,前端是获取不到的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容