session :1. Session 基于Cookie做用户验证时:敏感信息不适合放在cookie中 a. Session原理 Cookie是保存在用户浏览器端的键值对 Session是保存在服务器端的键值对: 保存在数据库 使用session 前需要 执行 --Python manage.py makemigrations --python manage.py migrate 保存在内存中的形式: ‘随机字符串‘:{ ‘username‘: ‘....‘, ‘loging‘: ‘....‘, .... } b. Cookie和Session对比 c. Session配置(缺少cache) d. 示例:实现两周自动登陆 - request.session.set_expiry(60*10) - SESSION_SAVE_EVERY_REQUEST = True PS: cookie中不设置超时时间,则表示关闭浏览器自动清除 - session依赖于cookie - 服务器session request.session.get()#获取 request.session[x] = x request.session.clear() - 引擎配置
1 CACHES = { 2 ‘default‘: { 3 ‘BACKEND‘: ‘django.core.cache.backends.filebased.FileBasedCache‘, 4 ‘LOCATION‘: os.path.join(BASE_DIR,‘cache‘) 5 } 6 } 7 SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘ # 引擎(默认)#保存在数据库中 8 9 SESSION_ENGINE = ‘django.contrib.sessions.backends.cache‘ #在缓存中 10 11 SESSION_ENGINE = ‘django.contrib.sessions.backends.file‘ #在文件中 12 13 SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db‘ #缓存加数据库 14 15 SESSION_ENGINE = ‘django.contrib.sessions.backends.signed_cookies‘ #加密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过期(默认) # set_cookie(‘k‘,123) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
session 操作 1. 获取session中的值
request.session[‘key‘] #获取不到会报错 request.session.get(‘key‘,None)#获取不到返回None
2. 设置session中的值
request.session[‘key‘]=123# 没有创建 有则替换 request.session.setdefault(‘key‘,123)#存在则不替换
删除:
del request.session[‘key‘]
3. 所有 键 值 键值对
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的随机字符串 在数据库中是否存在 requset.session.exists(‘session_key‘)#request.session.get(‘key‘,None)#包含了 #删除 用户session的随机字符串 及对应的 键值 requset.session.delete(‘session_key‘) request.session.clear()#注销使用
#设置超时时间 :
request.session.set_expiry(value) * 如果valus为整数 ,session会在秒数后失效 * 如果valus为datatime或timedelta ,session会在这个时间后失效 * 如果valus为0 ,session会在关闭浏览器后失效 * 如果valus为0 ,session会在关闭浏览器后失效
#################################### CSRF #########################################
CSRF: a. CSRF原理 {%csrf_token%}#前端生成一个随机字符串 --在表单中 和COOKIS 中都有存在 但不一样 django为用户实现防止跨站请求伪造的功能, 通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。 而对于django中设置防跨站请求伪造功能有分为全局和局部。 全局 --在全局发送POST数据时,需要 csrf_token 局部 [email protected]_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。 [email protected]_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。 注:from django.views.decorators.csrf import csrf_exempt,csrf_protect b. 无CSRF时存在隐患 c. Form提交 (CSRF) <form> {%csrf_token%} </form> d. Ajax提交 (CSRF) CSRF请求头 X-CSRFToken (不能有下划线) 示例:
$(function(){ // $.ajaxSetup({//当前所有ajax发送 全局 beforeSend: function(xhr,settings){//发送ajax前 先执行这个函数 xhr.setRequestHeader(‘X-CSRFtoken‘, $.cookie(‘csrftoken‘)); } }); $(‘#btn1‘).click(function () { $.ajax({ url: ‘/login/‘, type:"GET", data: {‘user‘: ‘root‘, ‘pwd‘: ‘123‘}, // headers: {‘X-CSRFtoken‘: $.cookie(‘csrftoken‘)}, success:function(arg){ } }) }); })
时间: 2024-11-21 04:35:35