Django之APPEND_SLASH配置爬坑

入坑

测试妹纸∩︿∩反馈BUG,Django项目的某前端页面AJAX报错如下:
Mixed Content: The page at 'https://.../roles/' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://.../role/1/'. This request has been blocked; the content must be served over HTTPS.

一顿某道翻译操作之后,大概意思是HTTPS的页面AJAX请求了一个HTTP协议的接口,由于某种安全机制,引发了 混合内容(Mixed Content)错误,所以该请求被阻止了。源码片段如下:

复制代码
      var role_id = $(this).attr('data-id');
      $.ajax({
        type: "GET",
        url:"/role/"+role_id,
        dataType: "json"        
      }).done(function(msg){
         ... 
      }).fail(function(msg){
         ...
      });
爬坑

开发老司机告诉我们,从报错入手,先查了下什么是混合内容(Mixed Content)。

混合内容:初始 HTML 内容通过安全的 HTTPS 连接加载,但其他资源(例如,图像、视频、样式表、脚本)>则通过不安全的 HTTP 连接加载。因为页面通过 HTTPS 加载的初始请求是安全的,但是又加载了不安全的>HTTP内容,因此称之为混合内容。

因为HTTPS的S本身就是Secure的意思,现代浏览器最初会针对此类型的内容显示警告,以向用户表明此页面 包含不安全的资源。但是即使显示警告,页面也已经加载,用户的安全仍然受到了威胁。所以没过多久, Chrome和Firefox就直接阻断掉了这类的请求。这就是HTTPS页面为什么发送不了HTTP的原因。

what?也就是说,AJAX请求的URL是HTTP协议的?神奇,颠覆了我以往的认知,这种写法不应该是默认访问HTTPS协议的地址嘛?!漫漫爬坑路之开始。

  • 第一次爬坑
    直接把URL写成绝对的,代码修改如下:

    复制代码
       var role_id = $(this).attr('data-id');
       $.ajax({
         type: "GET",
         url:"https://..../role/"+role_id,
         dataType: "json"        
       }).done(function(msg){
          ... 
       }).fail(function(msg){
          ...
       });

第一次爬坑失败,分析:这种修改仍然无效的话,可能是Django的某种配置造成的。翻文档发现了APPEND_SLASH这个配置。官方文档介绍如下:

APPEND_SLASH

Default: True

When set to True, if the request URL does not match any of the patterns in the URLconf and it doesn't end in a slash, an HTTP redirect is issued to the same URL with a slash appended. Note that the redirect may cause any data submitted in a POST request to be lost.

大概意思是,如果这个配置为True,请求到URL不能匹配到任何结果且不是以"/"结尾,则Django会自动增加"/"并以HTTP访问它。坑点就在这个HTTP上面呀,难怪不管怎么样都访问的HTTP!

  • 第二次爬坑
    将AJAX的URL后面加上"/",就能匹配到Django设置的URL了,成功解决问题。
填坑

BUG产生的主要原因是项目的URL配置不规范,为了阻止这种跳转,关闭了APPEND_SLASH,并且所有URL都改为以"/"结尾。URL是不是以"/"结尾的区别,可以看这篇文章:https://www.jianshu.com/p/83c2fa941fd8

相关推荐
实名上网宋凯宣37 分钟前
Django
后端·python·django
如若1232 小时前
【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
人工智能·python
利威尔xu2 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
逃逸线LOF3 小时前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
砚底藏山河3 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
慢云智慧空间3 小时前
从设备智能到空间理解,空间智能终端解决方案商如何重新定义行业标准
后端
视觉小萌新3 小时前
AI Class 3 · Chapter 1:变量、字符串、list/dict、if/for(python学习-小白版-有经验可跳过)
python·学习·list
利威尔xu3 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
薛定谔的猫-菜鸟程序员4 小时前
软件架构设计师开发资料大全(从入门到精通)
后端·python·系统架构·flask·架构设计师
IT_陈寒6 小时前
SpringBoot多环境配置把我坑惨了,这个踩坑经验你最好看看
前端·人工智能·后端