IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Django如何使用中间件,以及解决使用中间件的跳转问题 -> 正文阅读

[Python知识库]Django如何使用中间件,以及解决使用中间件的跳转问题

项目场景:

最近在学Django的博客项目,将项目的后端和前端写完后,发现有安全问题(随便输入个网站都能进,按道理来说只有登陆了才能这么放肆阿),都是自己摸索的解决方法,可能不那么正规,羸弱的我只能这么弄,学识不够阿。


问题描述:

1.学习了中间件之后,使用中间件过滤登录信息时,发现将验证码和注册网址给过滤了。

中间件的使用

什么是中间件?

Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。

我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。

简而言之,我想做登录验证,那就得用中间件来检测是否登录过,才能访问相应的其他链接。

登录界面

#如果用户名和密码正确,如下:
  				auth.login(request, user)  # 当前登录对象
                response['user'] = user.username
                # 设置session
                request.session['login'] = 'ok'
                # 获取用户想直接访问的URL
                url = request.GET.get('next')
                # 如果有,就跳转到客户初始想访问的URL
                if not url:
                    # 没有则默认跳转到index页面
                    url = '/index/'
                print("request.session['login']:", request.session['login'], url)

                return redirect(url)

中间件创建

  • 在项目文件夹(非app文件夹,即有setting的那个)里面创建一个中间件.py
  • 像app注册那样,在setting中找到中间件的注册位置,写入当前类的位置
    在这里插入图片描述
    在这里插入图片描述

中间件代码

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect


class Check_Login(MiddlewareMixin):
    def process_request(self, request):
        next_url = request.path_info
        if not next_url.startswith('/login/'):
            is_login = request.session.get('login', '')
            print("next_url", next_url, is_login)
            if not is_login:
                return redirect('/login/')

在这里插入图片描述


原因分析:

1.在跳转前中间件中输出了具体的路径,但是发现这些路径都不能进入判断条件,那就将路径设置为可以进入if的写法
2.在正确的验证码和用户密码跳转前,因为是使用的Ajax的传值方法,所以在js代码中写入alert提示,提示如果可以说明能重新跳转。

下面是访问的url路径配置

在这里插入图片描述

无法访问到验证码返回的图片,即访问不了get_valid/

在这里插入图片描述

无法访问到register页面,即访问不了register/,一直在login页面

在这里插入图片描述

在访问后验证码和注册的连接都无法进入到中间件中

在这里插入图片描述

发现无法使用login之外的链接,虽然做到了安全性,但是隔绝了验证码和注册。


解决方案:

在中间件中的标签明显是只接受login/开头的链接,如果得到的不是login的链接,统统重定向到登录界面
在这里插入图片描述
所以解决方法就是将注册和验证码的链接改成login开头的嘛
在这里插入图片描述
在这里插入图片描述
这样一来,就得到解决了,但是羸弱的我搞了半个小时才搞清思路。
在这里插入图片描述
在这里插入图片描述

删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式 删除线格式

问题描述2:

2.输入正确的验证码和用户密码后无法跳转到相应的首页,而且一直在登录界面无反应

前面的问题解决了,然后开开心心的输入验证码和密码啥的,点半天,又一直回到了login。
在这里插入图片描述

然后多点了几下登录就报错了,这个错的原因好像是因为攻击令牌csrftoken的原因,反正就是跳不过去。

在这里插入图片描述

但是有个很奇葩的情况,我将网址index却可以访问,说明中间件的条件通过了,但是无法跳转到index首页

在这里插入图片描述

打印login方法和中间件条件信息发现它好像进到了循环条件,但是最后又没重定向,因为拿到了ok嘛,就这很伤脑筋,而且在js里面打印的alert窗口也未弹出。

在这里插入图片描述

解决方案2:

因为在后台views.py里写的跳转方式是Ajax的,在前端返回验证码和用户密码查询成功后,做如下代码操作:

  if user:
      auth.login(request, user)  # 当前登录对象
      response['user'] = user.username
      # 设置session
      request.session['login'] = 'ok'
      # 获取用户想直接访问的URL
      url = request.GET.get('next')
      # 如果有,就跳转到客户初始想访问的URL
      if not url:
          # 没有则默认跳转到index页面
          url = '/index/'
      print("request.session['login']:", request.session['login'], url)

      return redirect(url)

明显是跳转了的,而且默认是跳转首页index的,但是却并未在前端界面进行刷新,Ajax传递的代码也并未执行,alert弹窗并未弹出,后面想着既然Ajax是局部刷新,使用重定向是不是有问题的,重定向是相当于重新访问了这个网页,那携带的数据是否会无法被Ajax拿到呢,在一篇博客中看到关于Ajax和重定向的问题,得到启发,Ajax既然是局部刷新,为啥我返回使用重定向呢,是不是吃饱了撑着阿。

在这里插入图片描述

想到这些,果断将重定向换成HttpResponse,因为需要传递user之类的数据,就使用JsonResponse进行传递

 			if user:
                auth.login(request, user)  # 当前登录对象

                response['user'] = user.username
                # 设置session
                request.session['login'] = 'ok'
                # 获取用户想直接访问的URL
                url = request.GET.get('next')
                # 如果有,就跳转到客户初始想访问的URL
                if not url:
                    # 没有则默认跳转到index页面
                    url = '/index/'
                print("request.session['login']:", request.session['login'], url)

                # return redirect(url)

                return  JsonResponse(response)
            else:
                response['msg'] = "用户名或密码错误!"

在这里插入图片描述
因为js里面输出的是原网页地址,所以打印的是这个
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总之是Ajax和重定向搭配不当造成的。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-30 12:31:14  更:2021-10-30 12:31:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:02:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码