python,day22-sessin
Session:session 依赖于cookie
流程: 用户登陆之后,客户端自动生成一个随机字符串,发送给服务器端,服务器端将随机字符串以及敏感信息保存在数据库里,cookie 保存随机字符串 session 保存所有信息
基于cookie 做用户验证时: 敏感信息不适合存放在cookie 中,但优点是: 把存储数据的压力放在客户端,服务端压力小了
Session 原理:
cookie 是保存在用户浏览器端的键值对
session 是保存在服务端的键值对
在做session 之前必须得先执行 python manage.py makemigrations 和 python manage.py migrate
session 默认的超时时间为2周 默认存储在数据库里面
session超时实例
from django.shortcuts import render,redirect,HttpResponse
from django.views import View
from pro1 import models
# Create your views here.
class login(View):
def get(self,request,**kwargs):
return render(request, "login.html")
def post(self,request):
user = request.POST.get('username')
pwd = request.POST.get('password')
if models.Usersinfo.objects.filter(username=user,password=pwd).first():
request.session['username'] = user# 设置session值
request.session['is_login'] = True
if request.POST.get('rmb',None) == '1':
# 超时时间
request.session.set_expiry(10)
# print(request.POST.get('rmb',None))
return redirect('/index')
else:
return render(request,'login.html')
class index(View):
def get(self,request):
if request.session.get('is_login',None):
return render(request,'index.html',{'username': request.session['username']})
else:
return redirect('/login')
class logout(View):
def get(self,request):
request.session.clear()
return redirect('/login')
login.html
<div>
<form action="/login" method="post">
<p><span>用户名:</span><input type="text" placeholder="username" name="username"></p>
<p><span>密码:</span><input type="password" placeholder="password" name="password"></p>
<p><input type="submit" value="提交"><input type="checkbox" name="rmb" value="1">10秒免登录</p>
</form>
</div>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>欢迎登录: {{ username }},{{ request.session.username }}</h1>
<a href="/logout">注销</a>
</body>
</html>
request.session.set_expiry(value) 设置超时时间
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。 默认值:
SESSION_COOKIE_NAME = "sessionid" # Session 的cookie保存在浏览器上时的key
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周)(默认) set_cookie('k',123)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session 默认修改之后才保存(默认)
如果想页面在放置时间超过一定的时间才生效,需要在settings.py 里面设置:
session_save_every_request=True
使用:
获取session数据:
request.session['k1']如果没有数据会报错
request.session.get('k1',None)
设置session
request.session['k1'] = 123
request.session.setdefault('k1',123) 存在则不设置
删除session
del request.session['k1']
所有键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.iteervalues()
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')
session 存储位置:
默认保存在数据库里
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
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,默认修改之后才保存(默认)
支持保存在缓存 缓存为memcache django 不支持redis,但是有redis的相关插件
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,默认修改之后才保存
支持文件session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None #
缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
# 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
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,默认修改之后才保存
缓存 + 数据库 session
数据库用于做持久化,缓存用于提高效率
配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
加密cookie Session
配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
session 验证:
def login(func):
def wrap(request, *args, **kwargs):
# 如果未登陆,跳转到指定页面
if request.path == '/test/':
return redirect('http://www.baidu.com')
return func(request, *args, **kwargs)
return wrap
CSRF:
django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。
csrf 原理 使用随机字符串 csrf_token
在页面上如果要显示: ` csrf_token ` 隐藏: {% csrf_token %}
****注: 请求头不能出现下划线 X-CSRFtoken
全局: 中间件 在settings.py 中 设置 django.middleware.csrf.CsrfViewMiddleware
局部:
* @csrf_protect 为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
* @csrf_exempt 取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注: from django.views.decorators.csrf import csrf_exempt,csrf_protect
应用:
1、普通表单 Form
veiw中设置返回值:
return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))
或者
return render(request, 'xxx.html', data)
html中设置Token:
{% csrf_token %}
2、Ajax
from django.template.context import RequestContext
# Create your views here.
def test(request):
if request.method == 'POST':
print request.POST
return HttpResponse('ok')
returnrender_to_response('app01/test.html',context_instance=RequestContext(request))
html
全局配置csrf:
$(function(){
$.ajaxSetup({
beforeSend: function(xhr,settings){
xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'))
}
});
$('#btn1').click(function(){
*****
})
})
单个ajax
$(function(){
$('#btn').click(function(){
$.ajax({
url: "/login/",
type: "POST",
data: {"user": 'root',"pwd": '123'}
headers: {'X-CSRFtoken': $.cookie('csrftoken')},
success: function(arg){
}
})
})
})
页:
[1]