0

0

在Django模板中安全地在JavaScript中使用环境变量

聖光之護

聖光之護

发布时间:2025-10-23 08:44:21

|

467人浏览过

|

来源于php中文网

原创

在Django模板中安全地在JavaScript中使用环境变量

本教程旨在解决在django应用中,如何在客户端javascript中安全地访问存储在`.env`文件中的敏感环境变量。由于javascript无法直接读取服务器端环境变量,文章将详细介绍一种通过django视图创建json api接口,并在前端javascript中使用ajax请求获取这些变量的解决方案,确保凭证不直接暴露在客户端代码中,提升应用安全性。

背景与挑战

在Web开发中,将API密钥、客户端ID等敏感配置信息存储在.env文件中是一种常见的安全实践。在Python后端(如Django)中,我们可以方便地使用os.getenv()来读取这些环境变量。然而,当需要在客户端JavaScript代码中使用这些变量时,直接访问服务器端环境变量是不可能的,并且将这些敏感信息硬编码到JavaScript文件中会带来严重的安全风险,因为它们将暴露给所有访问网站的用户。

本文将提供一种安全且推荐的方法,通过Django后端作为桥梁,将必要的环境变量安全地传递给客户端JavaScript。

解决方案概述:通过JSON API传递环境变量

核心思想是创建一个Django视图,该视图负责从.env文件加载所需的环境变量,然后将这些变量封装成JSON格式的响应。客户端JavaScript通过发起AJAX请求到这个特定的Django视图,获取并解析JSON响应,从而安全地获取到所需的环境变量。

实施步骤

1. 配置 .env 文件

首先,确保您的环境变量在.env文件中正确配置。为了能够通过os.getenv()正确读取,建议不要在值外部添加引号。

立即学习Java免费学习笔记(深入)”;

./env 示例:

# Google Drive API 凭证
GOOGLE_DRIVE_API_KEY=YOUR_GOOGLE_DRIVE_API_KEY
GOOGLE_DRIVE_API_CLIENT_ID=YOUR_GOOGLE_DRIVE_API_CLIENT_ID.apps.googleusercontent.com
GOOGLE_DRIVE_APP_ID=YOUR_GOOGLE_DRIVE_APP_ID

2. 创建 Django 视图

在您的Django应用中,创建一个视图函数,用于读取环境变量并返回JSON响应。

yourapp/views.py 示例:

ShoopD 网上商店系统
ShoopD 网上商店系统

用 php + mysql 驱动的在线商城系统,我们的目标为中国的中小企业及个人提供最简洁,最安全,最高效的在线商城解决方案,使用了自建的会员积分折扣功能,不同的会员组有不同的折扣,让您的商店吸引更多的后续客户。 系统自动加分处理功能,自动处理会员等级,免去人工处理的工作量,让您的商店运作起来更方便省事 采用了自建的直接模板技术,免去了模板解析时间,提高了代码利用效率 独立开发的购物车系统,使用最

下载
import os
from dotenv import load_dotenv
from django.http import JsonResponse

# 在应用启动时加载 .env 文件。
# 实际项目中,这通常在 settings.py 或 wsgi.py/asgi.py 中进行一次性加载。
# 这里为了演示方便,在视图中加载,但更好的实践是全局加载。
load_dotenv()  

def get_google_drive_credentials(request):
    """
    从环境变量中获取 Google Drive API 凭证并以 JSON 格式返回。
    """
    # 获取环境变量值
    google_drive_api_key = os.getenv('GOOGLE_DRIVE_API_KEY')
    google_drive_api_client_id = os.getenv('GOOGLE_DRIVE_API_CLIENT_ID')
    google_drive_app_id = os.getenv('GOOGLE_DRIVE_APP_ID')

    # 构建 JSON 响应数据
    data = {
        'api_key': google_drive_api_key,
        'client_id': google_drive_api_client_id,
        'app_id': google_drive_app_id,
    }

    # 返回 JSON 响应
    return JsonResponse(data)

注意事项:

  • load_dotenv() 应该在您的Django应用启动时(例如在 settings.py 或 wsgi.py 文件中)被调用一次,而不是在每个视图函数中。这样可以确保环境变量在整个应用生命周期中都可用。
  • 此视图只返回非敏感或前端必需的凭证。对于服务器端操作所需的敏感密钥,应始终保留在后端。
  • 在生产环境中,您可能需要为这个API端点添加身份验证和权限检查,以确保只有授权用户或服务才能访问这些凭证。

3. 配置 URL 路由

将上述视图函数映射到一个URL路径,以便客户端JavaScript可以访问它。

yourapp/urls.py 示例:

from django.urls import path
from . import views

urlpatterns = [
    path('get-google-drive-credentials/', views.get_google_drive_credentials, name='google_drive_credentials'),
]

确保将此URL配置包含在您的项目主 urls.py 文件中。

4. 在 Django 模板中调用 JavaScript

在您的Django模板中,使用JavaScript发起AJAX请求到上面定义的URL,获取并使用这些凭证。

your_template.html 示例:

<script>
    // 使用 XMLHttpRequest 发起 AJAX 请求
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
        // 当请求完成且状态为 DONE (4) 时
        if (xhr.readyState === XMLHttpRequest.DONE) {
            // 如果 HTTP 状态码为 200 (OK)
            if (xhr.status === 200) {
                // 解析 JSON 响应
                var response = JSON.parse(xhr.responseText);

                // 将获取到的凭证赋值给 JavaScript 变量
                var API_KEY = response.api_key;
                var CLIENT_ID = response.client_id;
                var APP_ID = response.app_id;

                // 定义 Google Drive API 的作用域
                var SCOPES = 'https://www.googleapis.com/auth/drive';

                // 在此处使用 API_KEY, CLIENT_ID, APP_ID 和 SCOPES 初始化 Google Drive File Picker
                console.log('API Key:', API_KEY);
                console.log('Client ID:', CLIENT_ID);
                console.log('App ID:', APP_ID);
                console.log('Scopes:', SCOPES);

                // 例如,初始化 Google API 客户端
                // gapi.load('client:picker', function() {
                //     gapi.client.setApiKey(API_KEY);
                //     gapi.client.drive.apps.list().then(function() {
                //         // ... your picker logic here ...
                //     });
                // });

            } else {
                // 请求失败,打印错误信息
                console.error('Failed to retrieve Google Drive credentials. Status:', xhr.status);
            }
        }
    };
    // 配置 GET 请求到凭证获取端点
    xhr.open('GET', '/get-google-drive-credentials/'); // 确保路径与您的 urls.py 配置一致
    // 发送请求
    xhr.send();
</script>

现代 JavaScript (Fetch API) 替代方案: 为了代码的简洁性和现代化,您也可以使用 fetch API 来替代 XMLHttpRequest:

<script>
    fetch('/get-google-drive-credentials/') // 确保路径与您的 urls.py 配置一致
        .then(response => {
            if (!response.ok) {
                throw new Error('Network response was not ok ' + response.statusText);
            }
            return response.json();
        })
        .then(data => {
            var API_KEY = data.api_key;
            var CLIENT_ID = data.client_id;
            var APP_ID = data.app_id;
            var SCOPES = 'https://www.googleapis.com/auth/drive';

            console.log('API Key (Fetch):', API_KEY);
            console.log('Client ID (Fetch):', CLIENT_ID);
            console.log('App ID (Fetch):', APP_ID);
            console.log('Scopes (Fetch):', SCOPES);

            // 在此处使用这些变量
        })
        .catch(error => {
            console.error('Failed to retrieve Google Drive credentials:', error);
        });
</script>

总结

通过上述方法,我们成功地实现了在Django模板中的JavaScript代码中安全地访问存储在.env文件中的环境变量。这种方法避免了将敏感信息直接硬编码到前端代码中,大大提高了应用的安全性。核心在于利用Django后端作为中间层,通过一个受控的API端点按需提供这些凭证,并且客户端JavaScript通过异步请求获取它们。在实际部署时,请务必考虑API端点的访问控制和错误处理机制,以进一步增强安全性与健壮性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

166

2026.02.04

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

455

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

166

2023.06.14

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

170

2023.08.31

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

124

2023.11.15

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号