目录
通过 CSRF 保护保护 Django AJAX 请求
应用程序设置
启用 CORS 和 CSRF 保护
获取并使用 CSRF 令牌
修改 POST 请求
重要注意事项
资源
首页 后端开发 Python教程 将 CSRF 保护与 Django 和 AJAX 请求结合使用

将 CSRF 保护与 Django 和 AJAX 请求结合使用

Jan 07, 2025 pm 06:15 PM

Using CSRF Protection with Django and AJAX Requests

通过 CSRF 保护保护 Django AJAX 请求

Django 的内置 CSRF(跨站请求伪造)保护在使用 django-admin startproject 创建项目时默认启用,利用 CSRF 令牌来防范恶意请求。 此中间件已添加到您的 settings.py.

对 Django 应用程序的每个 POST 请求都需要有效的 CSRF 令牌。在 Django 模板中,这是通过使用 POST 方法在任何表单中包含 {% csrf_token %} 来实现的。 然而,使用单独的前端 AJAX 请求处理 CSRF 保护需要不同的方法。

本教程演示使用来自单独前端的 AJAX 请求来保护简单的 Django 应用程序。

应用程序设置

我们的示例应用程序具有两个端点:

  • GET /get-picture:检索存储在服务器上的图像的 URL。
  • POST /set-picture:更新存储在服务器上的图像的 URL。

为了简单起见,省略了错误处理。 初始后端代码(在urls.py中)如下:

from django.urls import path
from django.http import JsonResponse
import json

picture_url = "https://picsum.photos/id/247/720/405"

def get_picture(request):
    return JsonResponse({"picture_url": picture_url})

def set_picture(request):
    if request.method == "POST":
        global picture_url
        picture_url = json.loads(request.body)["picture_url"]
        return JsonResponse({"picture_url": picture_url})

urlpatterns = [
    path("get-picture", get_picture),
    path("set-picture", set_picture)
]

对应的前端功能(简体):

// GET request to retrieve the image URL
async function get_picture() {
    const res = await fetch("http://localhost:8000/get-picture");
    const data = await res.json();
    return data.picture_url;
}

// POST request to update the image URL
async function set_picture(picture_url) {
    const res = await fetch("http://localhost:8000/set-picture", {
        method: "POST",
        body: JSON.stringify({ "picture_url": picture_url })
    });
}

为了处理跨源资源共享(CORS),我们将使用 django-cors-headers 包。

启用 CORS 和 CSRF 保护

安装django-cors-headers

pip install django-cors-headers

配置settings.py

INSTALLED_APPS = [
    "corsheaders",
    # ... other apps
]

MIDDLEWARE = [
    "corsheaders.middleware.CorsMiddleware",
    # ... other middleware
]

CORS_ALLOWED_ORIGINS = ["http://localhost:4040"] # Adjust port as needed
CSRF_TRUSTED_ORIGINS = ["http://localhost:4040"] # Add your frontend origin

虽然 GET 请求现在可以正常工作,但 POST 请求将由于 CSRF 保护而失败。 为了解决这个问题,我们需要手动管理 CSRF 令牌。

获取并使用 CSRF 令牌

创建一个新视图来提供 CSRF 令牌:

from django.views.decorators.csrf import ensure_csrf_cookie
from django.http import JsonResponse

@ensure_csrf_cookie
def get_csrf_token(request):
    return JsonResponse({"success": True})

urlpatterns = [
    # ... other paths
    path("get-csrf-token", get_csrf_token),
]

更新前端以获取令牌(使用js-cookie):

fetch("http://localhost:8000/get-csrf-token", { credentials: "include" });

credentials: "include" 选项确保浏览器处理任何 Set-Cookie 标头,存储 csrftoken cookie。 检查浏览器开发者工具中的网络选项卡以验证 cookie 是否已设置。

修改 POST 请求

最后,修改 set_picture 函数以在标头中包含 CSRF 令牌:

async function set_picture(picture_url) {
    const res = await fetch("http://localhost:8000/set-picture", {
        method: "POST",
        credentials: "include",
        headers: {
            'X-CSRFToken': Cookies.get("csrftoken")
        },
        body: JSON.stringify({ "picture_url": picture_url })
    });
}

这会添加 X-CSRFToken 标头以及 csrftoken cookie 中的值,从而启用成功的 POST 请求。

重要注意事项

这种方法有局限性,尤其是在不同域上部署前端和后端时。 浏览器安全策略可能会阻止设置或访问第三方 cookie,从而影响 CSRF 令牌管理。

资源

以上是将 CSRF 保护与 Django 和 AJAX 请求结合使用的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Laravel 教程
1604
29
PHP教程
1510
276
成品python大片在线观看入口 python免费成品网站大全 成品python大片在线观看入口 python免费成品网站大全 Jul 23, 2025 pm 12:36 PM

本文为您精选了多个顶级的Python“成品”项目网站与高水平“大片”级学习资源入口。无论您是想寻找开发灵感、观摩学习大师级的源代码,还是系统性地提升实战能力,这些平台都是不容错过的宝库,能帮助您快速成长为Python高手。

用于量子机学习的Python 用于量子机学习的Python Jul 21, 2025 am 02:48 AM

要入门量子机器学习(QML),首选工具是Python,需安装PennyLane、Qiskit、TensorFlowQuantum或PyTorchQuantum等库;接着通过运行示例熟悉流程,如使用PennyLane构建量子神经网络;然后按照数据集准备、数据编码、构建参数化量子线路、经典优化器训练等步骤实现模型;实战中应避免一开始就追求复杂模型,关注硬件限制,采用混合模型结构,并持续参考最新文献和官方文档以跟进发展。

python run shell命令示例 python run shell命令示例 Jul 26, 2025 am 07:50 AM

使用subprocess.run()可安全执行shell命令并捕获输出,推荐以列表传参避免注入风险;2.需要shell特性时可设shell=True,但需警惕命令注入;3.使用subprocess.Popen可实现实时输出处理;4.设置check=True可在命令失败时抛出异常;5.简单场景可直接链式调用获取输出;日常应优先使用subprocess.run(),避免使用os.system()或已弃用模块,以上方法覆盖了Python中执行shell命令的核心用法。

从Python中的Web API访问数据 从Python中的Web API访问数据 Jul 16, 2025 am 04:52 AM

使用Python调用WebAPI获取数据的关键在于掌握基本流程和常用工具。1.使用requests发起HTTP请求是最直接的方式,通过get方法获取响应并用json()解析数据;2.对于需要认证的API,可通过headers添加token或key;3.需检查响应状态码,推荐使用response.raise_for_status()自动处理异常;4.面对分页接口,可通过循环依次请求不同页面并加入延时避免频率限制;5.处理返回的JSON数据时需根据结构提取信息,复杂数据可用pandas转换为Data

python seaborn关节图示例 python seaborn关节图示例 Jul 26, 2025 am 08:11 AM

使用Seaborn的jointplot可快速可视化两个变量间的关系及各自分布;2.基础散点图通过sns.jointplot(data=tips,x="total_bill",y="tip",kind="scatter")实现,中心为散点图,上下和右侧显示直方图;3.添加回归线和密度信息可用kind="reg",并结合marginal_kws设置边缘图样式;4.数据量大时推荐kind="hex",用

如何加入Python的字符串列表 如何加入Python的字符串列表 Jul 18, 2025 am 02:15 AM

在Python中,使用join()方法合并字符串需注意以下要点:1.使用str.join()方法,调用时前面的字符串作为连接符,括号里的可迭代对象包含要连接的字符串;2.确保列表中的元素都是字符串,若含非字符串类型需先转换;3.处理嵌套列表时需先展平结构再连接。

python列表到字符串转换示例 python列表到字符串转换示例 Jul 26, 2025 am 08:00 AM

字符串列表可用join()方法合并,如''.join(words)得到"HelloworldfromPython";2.数字列表需先用map(str,numbers)或[str(x)forxinnumbers]转为字符串后才能join;3.任意类型列表可直接用str()转换为带括号和引号的字符串,适用于调试;4.自定义格式可用生成器表达式结合join()实现,如'|'.join(f"[{item}]"foriteminitems)输出"[a]|[

Python网络刮擦教程 Python网络刮擦教程 Jul 21, 2025 am 02:39 AM

掌握Python网络爬虫需抓住三个核心步骤:1.使用requests发起请求,通过get方法获取网页内容,注意设置headers、处理异常及遵守robots.txt;2.利用BeautifulSoup或XPath提取数据,前者适合简单解析,后者更灵活适用于复杂结构;3.针对动态加载内容使用Selenium模拟浏览器操作,虽速度较慢但能应对复杂页面,也可尝试寻找网站API接口提高效率。

See all articles