cookie和session
cookie 客户端浏览器上的键值对----为了做会话保持
- 只要浏览器中有cookie,再次向当前域发送请求,都会自动携带
- 携带在 请求头中得 cookie字段中
- cookie:"name=xxx;age=19"
- 不安全问题---》cookie中发了敏感数据---》客户能看到
-cookie设置: obj.set_cookie()
-cookie取值: request.COOKIES.get()
-清空: request.COOKIES.clear()
我们需要让cookie变的安全---》敏感数据不在cookie中方法,而放在session中
session的使用---》必须要先迁移表---》django-session表不存在
django-session表的字段
session_key: sessionid:随机字符串
session_data: 真正的数据--->加密了
expire_date: 过期时间
session的使用
取值:request.session.get()
赋值:request.session['name']='xxx'
session的本质执行原理
session的中间件把上述内容完成了:procee_request process_response
django.contrib.sessions.middleware.SessionMiddleware
配置session 存放路径(未完成,需要你完成)
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH='c://xxx/x'
SESSION_COOKIE_NAME = 'xxx'
from django.conf import settings
from django.contrib.sessions.backends import
中间件
中间件是什么
作用
- 全局的请求拦截---》如果它没有登录---》就不允许访问
- 拦截所有请求,获取请求的ip地址
- 记录所有用户的访问日志
- 统一在响应头中加数据
代码上:就是一个类,类中有几个方法
process_request(self,request) # 请求来了,就会走
process_response(self, request, response) # 请求走了就会走
process_view(self, request, callback, callback_args, callback_kwargs) #视图函数执行之前调用
process_template_response(self,request,response) # 渲染模板之前会走
process_exception(self, request, exception) # 视图函数中出现异常了才执行
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
# session相关的中间件
'django.contrib.sessions.middleware.SessionMiddleware',
# 公共中间件---》访问不带 / 路径,如果有 带 / 的路径,他会让你重定向到这个地址
'django.middleware.common.CommonMiddleware',
# csrf认证 xss cors
'django.middleware.csrf.CsrfViewMiddleware',
# 认证:request.user--->这个中间件做的
'django.contrib.auth.middleware.AuthenticationMiddleware',
# django的消息框架---》flask--》闪现
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
自定义中间件来使用,记录用户的请求地址和user-agent
class SaveRemoteAddr(MiddlewareMixin):
def process_request(self, request):
# request 是WSGIRequest 的对象
# print(request.session) # 一定要保证,session的中间件要在上面
# 这个request 就是当次请求的request
# 取出ip
ip = request.META.get('REMOTE_ADDR')
user_agent = request.META.get('HTTP_USER_AGENT')
print(ip)
print(user_agent)
# return HttpResponse('不让你看了') # 不会再走视图函数了
'''
能返回的情况:
1 None,表示执行完这个代码,继续往后执行---》还有中间件,继续执行--》最后进视图函数
2 四件套,后续不走了,中间件的process_response---》直接返回给浏览器了
'''
中间件,在响应头加入访问时间
import datetime
class AddHeaderMiddleWare(MiddlewareMixin):
def process_response(self, request, response):
# request中有没有session? 有
# request 如果在视图函数中,往request中放了值,在这里,就可以取出来 request.xxx
# print(request.xxx)
# 所有cookie中都带
# response.set_cookie('xxxxx', 'asdfds')
# 写入到响应头,访问服务端的时间
response['ttt'] = datetime.datetime.now()
return response # 一定要返回response对象
csrf认证相关
csrf是什么
跨站请求伪造
攻击原理
如何防范:
-django解决了这个问题---》只要发送post请求,必须携带一个csrf_token 随机字符串--->后端给的
-这个随机字符串可以带的位置?
1 请求体中(urlencoded,form-data):{csrfmiddlewaretoken:asdfasdf}
2 放在请求头中:'X-CSRFToken':asdfasdfasd
3 ajax提交数据:默认是urlencoded,放在请求体中没有任何问题
$.ajax({
method: 'post',
data: {username, password, csrfmiddlewaretoken},
success: function (res) {
console.log(res)
}
})
4 ajax提交,使用json格式---》就不能放在请求体中
只能放在请求头中:
$.ajax({
method: 'post',
headers:{'X-CSRFToken':csrfmiddlewaretoken},
contentType: 'application/json',
data: JSON.stringify({username, password}),
success: function (res) {
console.log(res)
}
})
post 提交的数据,都是从request.POST中取,前提是:必须是urlencoded和form-data格式
如果是json是取不到的