本文介绍: request 是WSGIRequest对象# print(request.session) # 一定要保证,session中间件要在上面# 这个request 就是当次请求request# 取出ipprint(ip)# return HttpResponse(‘不让你看了’) # 不会再走视图函数了”’能返回的情况:1 None,表示执行这个代码,继续往后执行—》还有中间件,继续执行–》最后视图函数

cookiesession

cookie 客户端浏览器上的键值对—-为了做会话保持

怎么来的? 服务端写入的—》服务端返回响应中写入—》浏览器自动取出来–》存起来
key value 形式–》过期时间—》path—》http only

    -cookie设置obj.set_cookie()
    -cookie取值request.COOKIES.get()
    -清空request.COOKIES.clear()
我们需要cookie变的安全—》敏感数据不在cookie中方法,而放在session

    –session服务端键值
    –sessioncookie有什么关系呢?
      

  {111:{name:lqz,age:19,password:123},222:{name:zs,age:19,password:666}}

    -把key,以cookie的形式,存到浏览器
        sessionid:111
    –当前浏览器以后再发请。就会携带 过来
    –我们根据带过来的cookie 111—-》 从 session中取对应数据

session使用—》必须要先迁移表—》djangosession表不存在
django-session表的字段
session_key:      sessionid:随机字符串
session_data:    真正的数据--->加密expire_date过期时间
session使用
	取值:request.session.get()
    赋值:request.session['name']='xxx'
session的本质执行原理

    1 咱么写了request.session[‘name‘]=’xxx‘,本质就是向session 对象放入name=xxx
    2 当前视图函数结束—–》经过 【中间件】 —》返回给了前端
        –django 内置了一个session中间件
        –判断request.session 有没有变化,如果有变化
            – 情况一:django-session表中没有数据
                在表中创建一条数据随机生成一个字符串[随机字符串session_key],把数据存入django-session表
                session_keyadsfasd
                session_dataname=xxx  加密后存到里面
                把随机字符串写入cookie中  :sessionid:adsfasd
            – 情况二:django-session表中有数据
                把session中所有的值–》加密后–》更新django-session表的session_data中,其他不变
    3 下次 再发请求进入任意视图函数—》又会经过  【中间件】—》视图函数
        -视图函数中取session:request.session.get(‘age’)
        –浏览器发请求—》携带cookie过来—》到了中间件—》根据sessionid取出随机字符串
        -拿着随机字符串django-session中查【session_key】—》 能查到就把 session_data的数据解密—》放到request.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 

中间件

中间件是什么

中间件顾名思义,是介于request与response处理之间的一道处理过程相对比较轻量级,并且在全局上改变django输入输出。因为改变的是全局,所以需要谨慎实用,用不好会影响性能

作用
  1. 全局的请求拦截—》如果它没有登录—》就不允许访问
  2. 拦截所有请求,获取请求的ip地址
  3. 记录所有用户访问日志
  4. 统一响应头中加数据
代码上:就是一个类,类中有几个方法
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) # 视图函数出现异常了才执行

django内置一些中间件—》增强了djagno功能
request.session
request.user
post 请求提交数据,拦截了—》csrf认证

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',
]
自定义中间件来使用记录用户的请求地址useragent
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什么

      跨站请求伪造

攻击原理

同一个浏览器中,如果登录了A网站没有退出,在B网站中,向A网站发送请求,浏览器会自动携带A网站的cookie,对于A网站后端来讲, 它就分辨不清到底是用户真实发的请求,还是黑客网站发的请求【都会携带用户真实的cookie

如何防范
	-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是取不到的

如果使用ajax发送请求

redirect  render就用不了了
 尽量使用JsonResponse

原文地址:https://blog.csdn.net/m0_71292438/article/details/134807561

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_47296.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注