跨域问题与Django解决方案:深入解析跨域原理、请求处理与CSRF防护

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 跨域问题与Django解决方案:深入解析跨域原理、请求处理与CSRF防护

前言

    跨域问题在Web开发中如影随形,而Django框架为我们提供了解决方案。本文将解析跨域原理,并介绍Django中处理跨域请求与CSRF防护的策略,助您轻松应对挑战。

跨域报错:Access to XMLHttpRequest at ‘http://127.0.0.1:8000/’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

一、为什么会出现跨域?

出于浏览器的同源策略限制。

同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

二、什么是跨域

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域

当前页面url 被请求页面url 是否跨域 原因
http://www.baidu.com http://www.baidu.com/index.html 同源(协议、域名、端口号相同)
http://www.baidu.com https://www.baidu.com/index.html 跨域 协议不同(http / https)
http://www.baidu.com http://www.google.com 跨域 主域名不同(baidu / google)
http://www.baidu.com http://blog.baidu.com 跨域 子域名不同(www / blog)
http://www.baidu.com: 8080/ http://www.baidu.com:8888/ 跨域 端口号不同(8080 / 8888)

三、跨域请求解决办法(Django)

3.1 安装第三方扩展:

pip install django-cors-headers

3.2 修改配置信息–setting.py:

注册corsheaders:

# settings.py
INSTALLED_APPS = (
 ...
 'corsheaders',
 ...
 )

添加中间件 — settings.py:

注意放在第一条,第一时间进行处理:

# settings.py
MIDDLEWARE = [
      # 添加跨域中间件
    'corsheaders.middleware.CorsMiddleware',
    
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',  
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',  # 关闭csrf验证
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

配置参数 settings.py,允许所有源访问:

# settings.py
CORS_ORIGIN_ALLOW_ALL = True

3.3 配置访问规则或白名单:

# settings.py
允许所有域名跨域(优先选择)
CORS_ORIGIN_ALLOW_ALL = True
# 配置白名单
# CORS_ORIGIN_WHITELIST = (
#     '*'
#     # '127.0.0.1:8000',
#     # 'localhost:8000',
#     # '127.0.0.1:8080',
#     # 'localhost:8080',
#'ads-cms-api.aataotao.com:8000'
#'taoduoduo-test.oss-cn-#shenzhen.aliyuncs.com:80',  # 线上
# #'10.0.2.187:8080'  # 本地
#)

3.4 跨域Cookie配置

允许django响应Cookie:

# settings.py
CORS_ALLOW_CREDENTIALS = True

在前端发起ajax请求的时候,请求中需要配置:

xhrFields:{withCredentials:true},  与后端跨域配合设置,配置允许前端携带cookie

3.5 前端代码示例:

首先在html中引入jquery源码,配置ajax:

<script src="js/jquery-2.2.0.min.js"></script>
$.ajax({
  url:"http://127.0.0.1:8000/app/collects/",
  dataType:'json',//设置返回数据类型
  type:"GET",//请求方式
    //data:
  xhrFields:{withCredentials:true},//设置支持携带cookie
  success:function(response){
    console.log('请求成功');
  },
  error:function(){
    console.log('请求失败');
  },
  async:true//是否异步
})

另: Django Web中 CSRF

在前端即templates中的html页面中添加 {% csrf_token %}

例如:login.html

<form action="http://127.0.0.1:8000/login/" method="post">
  {% csrf_token %}
    <input type="text" name="user" placeholder="username" class="input-item">
    <input type="text" name="phone" placeholder="phone" class="input-item">
    <input type="password" name="password" placeholder="password" class="input-item">
    <input type="submit" class="btn" value="login">
</form>


相关文章
|
1月前
|
存储 缓存 前端开发
Django 后端架构开发:存储层调优策略解析
Django 后端架构开发:存储层调优策略解析
39 2
|
1月前
|
缓存 前端开发 中间件
[go 面试] 前端请求到后端API的中间件流程解析
[go 面试] 前端请求到后端API的中间件流程解析
|
7天前
|
SQL 存储 安全
网络安全与信息安全:从漏洞到防护的全方位解析
【9月更文挑战第20天】在数字化时代,网络安全和信息安全的重要性日益凸显。本文将深入探讨网络安全的多个方面,包括常见的安全漏洞、加密技术的应用以及提升个人安全意识的方法。我们将通过实例分析,揭示网络攻击者如何利用安全漏洞进行入侵,同时展示如何使用加密技术保护数据安全。此外,我们还将讨论如何通过教育和实践提高大众的安全意识,以减少安全威胁的发生。文章旨在为读者提供一套全面的网络安全知识体系,帮助他们在日益复杂的网络环境中保护自己的信息资产。
|
14天前
|
SQL 存储 安全
Web安全-CSRF跨站请求伪造
Web安全-CSRF跨站请求伪造
33 5
|
30天前
|
数据采集
深度解析CancellationToken在HttpClient请求中的应用
本文讨论了在.NET环境中使用HttpClient进行爬虫开发时,如何应用CancellationToken来控制请求的生命周期,提高爬虫的效率和稳定性。通过结合爬虫代理IP技术、多线程请求、设置User-Agent和Cookie等策略,可以增强爬虫的灵活性并降低被网站封禁的风险。文章提供了一个使用CancellationToken和代理IP的多线程爬虫实现示例代码,并详细解析了代码的关键部分,包括CancellationToken的使用、代理IP的配置、并发请求的实现以及User-Agent和Cookie的设置。
深度解析CancellationToken在HttpClient请求中的应用
|
20天前
|
存储 JSON API
Python编程:解析HTTP请求返回的JSON数据
使用Python处理HTTP请求和解析JSON数据既直接又高效。`requests`库的简洁性和强大功能使得发送请求、接收和解析响应变得异常简单。以上步骤和示例提供了一个基础的框架,可以根据你的具体需求进行调整和扩展。通过合适的异常处理,你的代码将更加健壮和可靠,为用户提供更加流畅的体验。
54 0
|
1月前
|
开发者 Python
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
深入解析Python `requests`库源码,揭开HTTP请求的神秘面纱!
128 1
|
28天前
|
安全 开发者 数据安全/隐私保护
Xamarin 的安全性考虑与最佳实践:从数据加密到网络防护,全面解析构建安全移动应用的六大核心技术要点与实战代码示例
【8月更文挑战第31天】Xamarin 的安全性考虑与最佳实践对于构建安全可靠的跨平台移动应用至关重要。本文探讨了 Xamarin 开发中的关键安全因素,如数据加密、网络通信安全、权限管理等,并提供了 AES 加密算法的代码示例。
33 0
|
28天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:从漏洞到防护的全面解析
【8月更文挑战第31天】本文将深入探讨网络安全与信息安全的重要性,以及如何应对网络威胁。我们将从网络安全漏洞、加密技术、安全意识等方面进行知识分享,以帮助您更好地保护您的数据和隐私。通过阅读本文,您将了解到一些实用的技巧和建议,以提高您在网络世界中的安全性。
|
28天前
|
SQL 安全 网络安全
网络安全漏洞与防护:从加密技术到安全意识的全方位解析
【8月更文挑战第31天】在数字时代,网络安全的重要性日益凸显。本文将深入探讨网络安全的核心问题,包括常见的安全漏洞、加密技术的应用以及提升个人和企业的安全意识。通过具体案例和代码示例,我们将揭示如何有效防御网络攻击,保护数据安全。

推荐镜像

更多