Django操作cookie
设置cookie:对象点set_cookie()
获取cookie:request点COOKIE点get
set_cookie('key', 'value', max_age=5,expires=5)
参数:
KEY:k值
value:V值
max_age=None, 超时时间 cookie需要延续的时间(以秒为单位)如果参数是\ None`` ,这个cookie会延续到浏览器关闭为止
expires=None, 超时时间(IE 浏览器使用的.)
path=’/‘, Cookie生效的路径,/ 表示根路径
baidu.com------------->一级域名-------------->解析出来很多个二级域名
(www.baidu.com www1.baidu.com www2.baidu.com ly.baidu.com)
secure=False, 浏览器将通过HTTPS来回传cookie
httponly=False 只能http协议传输,无法被JavaScript获取
obj.delete_cookie('username') 清除cookie
Django操作session
session就是把数据保存在后端,保存在后端的载体其实有很多种,比如:可以把数据保存在数据库、文件、Redis中
Django的默认保存位置在数据库中,在django_session表中,这张表是默认生成的
操作session
def set_session(request): request.session['k1'] = 123
request.session.get('k1',None)获取数据
del request.session['k1'] 删除数据
request.session.setdefault('k1',123) # 存在则不设置 return Httpresponse(‘ok’)
设置成功一个session值有什么变化
1. 会生成一个随机字符串
2. 会把用户设置的信息保存在django_session表中,数据也做了加密处理
3. 把数据封装到了request.session里去了
4. Django后端把随机字符串保存到了浏览器中
5. 随机字符串保存在浏览器中的key=sessionid
当设置多个session值的时候,session_key是不变的,变的是session_Data
当设置多个session值的时候,django_Session表中只存在一条记录(一台电脑的一个浏览器)
好处:节省空间
获取session发生的事
1. 浏览器先把sessionid回传到Django的后端
2. Django后端获取到sessionid,然后去数据表中根据session_key查询
如果查到了,说明之前已经登陆过了
如果查不到,就返回None
3. 查询出来的数据默认是加密的,Django后端又把数据解密之后封装到request.session中
在取session值的时候,就从request.session中取
方法:
# 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items()
request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略
Django中的Session配置
1. 数据库Session SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) 2. 缓存Session SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 3. 文件Session SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存+数据库 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 5. 加密Cookie Session SESSION_ENGINE = 'django.contrib.sessions.backends.signed_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过期(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
cbv添加装饰器
三种方法:
1.在内上方设置:
@method_decorator(login_auth,name='get') @method_decorator(login_auth,name='post')
2.在内的方法中设置
@method_decorator(login_auth)
3.直接重写一个dispatch方法
@method_decorator(login_auth) def dispatch(self, request, *args, **kwargs): obj=super().dispatch(request, *args, **kwargs) return obj
案例:
from django import views from django.utils.decorators import method_decorator # @method_decorator(login_auth,name='get') # @method_decorator(login_auth,name='post') class UserList(views.View): # @method_decorator(login_auth) def dispatch(self, request, *args, **kwargs): obj=super().dispatch(request, *args, **kwargs) return obj @method_decorator(login_auth) def get(self,request): return HttpResponse('我是用户列表') def post(self,request): return HttpResponse('我是用户列表')
中间件
-
Django自带的有七个中间件,每一个中间件都有各自独立的功能,它也支持我们自己写中间件
-
跟全局相关的功能你都可以写一个中间件来完成
-
权限校验
-
IP校验
-
频率限制
-
认证的等
中间件它的执行位置在web服务网关接口之后,在路由匹配之前执行的 django中自带的有七个中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] # 每一个中间件都有它自己独立的功能 # 它也支持我们自己自定义中间件 只要是跟全局相关的都可以用中间件来实现
中间件自定义:
中间件就是一个类,然后这个类都继承了 MiddlewareMixin
掌握类中的方法:
process_request(self,request)
process_view(self, request, callback, callback_args, callback_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)
process_response(self, request, response)
自定义中间件步骤:
1. 在项目名下或者任意的应用名下创建一个文件夹
2. 在这个文件夹下面创建一个py文件
3. 在该py文件中写一个自定义的类必须要继承MiddlewareMixin
4. 写完之后紧接着一定要去配置文件中注册中间件
研究:如果我在第一个中间件的process_request中return返回值,后续的中间件如何走?
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class Md1(MiddlewareMixin): def process_request(self,request): print("Md1请求") def process_response(self,request,response): print("Md1返回") return response class Md2(MiddlewareMixin): def process_request(self,request): print("Md2请求") #return HttpResponse("Md2中断") def process_response(self,request,response): print("Md2返回") return response
结果
Md1请求 Md2请求 view函数... Md2返回 Md1返回如果当请求到达请求2的时候直接不符合条件返回,即return HttpResponse(“Md2中断”),程序将把请求直接发给中间件2返回,然后依次返回到请求者 结果
Md1请求 Md2请求 Md2返回 Md1返回
csrf跨站请求
在form表单中应用:
<form action="" method="post"> {% csrf_token %} <p>用户名:<input type="text" name="name"></p> <p>密码:<input type="text" name="password"></p> <p><input type="submit"></p> </form>
在Ajax中应用:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script src="/static/jquery-3.3.1.js"></script> <title>Title</title> </head> <body> <form action="" method="post"> {% csrf_token %} <p>用户名:<input type="text" name="name"></p> <p>密码:<input type="text" name="password" id="pwd"></p> <p><input type="submit"></p> </form> <button class="btn">点我</button> </body> <script> $(".btn").click(function () { $.ajax({ url: '', type: 'post', data: { 'name': $('[name="name"]').val(), 'password': $("#pwd").val(), 'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val() }, success: function (data) { console.log(data) } }) }) </script> </html>
使用django官方提供的js文件
function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie !== '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } var csrftoken = getCookie('csrftoken'); // 每一次都这么写太麻烦了,可以使用$.ajaxSetup()方法为ajax请求统一设置。 function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ beforeSend: function (xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } });
将下面的文件配置到你的Django项目的static静态文件中,在html页面上通过导入该文件即可自动帮我们解决ajax提交post数据时校验csrf_token的问题,(导入该配置文件之前,需要先导入jQuery,因为这个配置文件内的内容是基于jQuery来实现的)
标签:SESSION,跨站,中间件,request,Django,session,cookie,django From: https://www.cnblogs.com/shanghaipudong/p/17620604.html