cookie: 现在所有网站基本都要开启cookie
客户端浏览器上的一个文件
例如: {‘key’: 'sefwefqefwefw'} 是一个键值对
简单实现cookie认证:
user_in = { 'zhangjian': {'pwd': '123'}, 'xiefengmei': {'pwd': '123'}, } def log(request): if request.method == 'GET': return render(request, 'log.html') if request.method == 'POST': u = request.POST.get('username') p = request.POST.get('pwd') dic = user_in.get(u) if not dic: return render(request, 'log.html') if dic['pwd'] == p: res = redirect('/tpl/') res.set_cookie('username', u) return res else: return render(request, 'log.html') def tpl(request): v = request.COOKIES.get('username') if not v: return redirect(request, '/log/') return render(request, 'tpl.html', {'current_user': v})
HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>{{ current_user }}</h1> </body> </html>
获取客户端的cookie:
request.COOKIES
request.COOKIES['username111']
request.COOKIES.get('username111')
设置用户cookie:
response = render(request, 'index.html')
response = redirect('/index/')
response.set_cookie('key',‘value’) #这种方式只能设置cookie, 关闭浏览器就会失效
return response
设置加密的cookie:
obj = HttpResponse('s')
obj.set_signed_cookie('username',"zhangjian",salt="wioahf2i3") #设置加密的cookie,salt是一个加密字符串
request.get_signed_cookie('username',salt="wiioahf2i3") #接收加密的cookie,利用salt解密
cookie参数:
超时时间:
1.response.set_cookie('key',‘value’,max_age=10) # max_age过期时间,cookie失效时间,多少秒之后失效
2. import datetime
current_date = datetime.datetime.utcnow() + datetime.timedelta(seconds=10)
response.set_cookie('key',‘value’,expires=current_date) # expires是到什么时间失效
路径:
response.set_cookie('key',‘value’,path=‘/’) #cookie生效的路径, ‘/’表示根路径,根路径的cookie可以被任何url访问
域名:
response.set_cookie('key',‘value’,domain=None) #cookie生效的域名
其他:
response.set_cookie('key',‘value’,secure=False) #如果是https的网站需要,改为True
response.set_cookie('key',‘value’,httponly=False) #表示只能使用http协议传输,无法使用javascript获取(document.cookie)
JS操作cookie:
def user_list(request): current_page = request.GET.get('p', 1) current_page = int(current_page) val = request.COOKIES.get('per_page_count',10) #取出前端JS传来的cookie里面的 ‘per_page_count’ ,默认值设置为10 page_obj = Page(current_page, len(LIST), int(val)) data = LIST[page_obj.start: page_obj.end] page_str = page_obj.page_str("/user_list/") return render(request, 'user_list.html', {'li': data, 'page_str': page_str})
HTML
<script src="/static/jquery.min.js"></script> <script src="/static/jquery.cookie.js"></script> <script> $(function() { #网页加载时运行 var v = $.cookie('per_page_count'); #加载网页时 取cookie里面‘per_page_count’的值v $('#ps').val(v); #将值v设置到 id=ps 的标签里面 }); function changePageSize(ths) { var v = $(ths).val(); #绑定 onchange事件得到值 v $.cookie('per_page_count', v); #将 v 设置到 键为‘per_page_count’里面 location.reload(); #刷新网页 }; </script>
简单的用JS设置一个cookie:
基于cookie做用户验证时:敏感信息不适合放在cookie中
session原理:
cookie是保存在用户浏览器的键值对
session是保存在服务器端的键值对
例如: session = afhashebwf213@!#: {
'is_login': True,
'user': 'zhang'
'nid': ...
...
}
# 基于session做用户验证
def logi(request): if request.method == "GET": return render(request, 'logi.html') elif request.method == "POST": user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'root' and pwd == "123": request.session['username'] = user # 给session中设置值 request.session['is_login'] = True # 给session中设置值 return redirect('/ind/') else: return render(request, 'logi.html') def ind(request): if request.session['is_login']: # 获取session中的值 return HttpResponse(request.session['username']) else: return HttpResponse('请你登录')
# 获取、设置、删除Session中数据
request.session[
'k1'
] #取k1的值 如果不存在报错
request.session.get(
'k1'
,
None
) #取k1的值 如果不存在返回None
request.session[
'k1'
]
=
123 #设置k1的值为123
request.session.setdefault(
'k1'
,
123
)
# 存在则不设置
del
request.session[
'k1'
] #删除k1
# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 用户session的随机字符串
request.session.session_key
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查 用户session的随机字符串 在数据库中是否
request.session.exists(
"session_key"
)
# 删除当前用户的所有Session数据
request.session.delete(
"session_key"
)
request.session.set_expiry(value)
*
如果value是个整数,session会在些秒数后失效。
*
如果value是个datatime或timedelta,session就会在这个时间后失效。
*
如果value是
0
,用户关闭浏览器session就会失效。
*
如果value是
None
,session会依赖全局session失效策略。
#注销时清空session def logout(request): request.session.clear() return redirect('/login/')
#设置session来实现免登陆
<form action="/logi/" method="POST"> <input type="text" name="user"/> <input type="text" name="pwd"/> <input type="checkbox" name="rmb" value="1" /> 10秒免登陆 <input type="submit" value="提交"/> </form>
def logi(request): if request.method == "GET": return render(request, 'logi.html') elif request.method == "POST": user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'root' and pwd == "123": request.session['username'] = user request.session['is_login'] = True if request.POST.get('rmb',None) == '1': request.session.set_expiry(10) # 超时时间 return redirect('/ind/') else: return render(request, 'logi.html')
#session配置文件及其参数:
settings.py里面配置管理
SESSION_ENGINE
=
'django.contrib.sessions.backends.cache'
# 引擎
SESSION_CACHE_ALIAS
=
'default'
# 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
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,默认修改之后才保存(每次用户操作需不需要更新过期时间)
# 引擎的配置Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
- 数据库(默认)
- 缓存
- 文件
- 缓存+数据库
- 加密cookie
1. 数据库:
SESSION_ENGINE
=
'django.contrib.sessions.backends.db' # 表示把session放在数据库中
2. 缓存:
SESSION_ENGINE
=
'django.contrib.sessions.backends.cache'
# 表示把session放在缓存中存储
SESSION_CACHE_ALIAS
=
'memcache-1'
CACHES = { # 例如memcache连接信息 'memcache-1': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] } }
SESSION_ENGINE
=
'django.contrib.sessions.backends.file'
# 表示把session存储在临时文件中
SESSION_FILE_PATH
=
os.path.join(BASE_DIR,'cache') # 表示存储session的临时文件的文件路径SESSION_ENGINE
=
'django.contrib.sessions.backends.cached_db'
SESSION_ENGINE
=
'django.contrib.sessions.backends.signed_cookies'