使用Django框架时如何在AJAX请求时隐藏浏览器网络栏的API请求URL?
解决方案:通过Django后端代理隐藏目标API地址
所有前端直接发起的HTTP请求必然会被浏览器调试工具的网络面板捕获,没有任何前端层面的方案可以隐藏请求的真实目标URL。要实现你的需求,唯一可行的方式是后端代理模式:前端不再直接调用目标第三方API,而是调用你自己Django服务的内部接口,由Django后端代为发起对目标API的请求,再将结果返回给前端。
这种模式下浏览器的网络面板只会展示你Django服务的内部接口路径,完全看不到真实的目标API地址。
第一步:修改前端Ajax代码
替换原请求的目标地址为Django内部接口路径,同时修正原代码的语法错误(token作用域异常、多余逗号、重复data字段问题),修正后的代码如下:
function Approve(camp_id, updated) { // 统一处理token和payload,修正原代码作用域问题 const token = '{{csrf_token}}'; let payload = updated === 1 ? {'campaign_status': 5} : {'campaign_status': 1}; payload.camp_id = camp_id; $.ajax({ // 替换为你Django服务的内部代理接口地址 url: `/api/proxy/campaign-approve/`, type: "PUT", headers: { "X-CSRFToken": token }, contentType: "application/json", data: JSON.stringify(payload), success: function(response, xhr) { window.location.reload(); }, error: function(response, xhr) { console.log(response) } }); }
第二步:编写Django代理接口
首先安装网络请求依赖:pip install requests
在Django应用的views.py中添加代理视图:
import json import requests from django.http import JsonResponse from django.views.decorators.http import require_http_methods from django.contrib.auth.decorators import login_required # 目标API地址写在后端,不会暴露给前端 TARGET_API_URL = "https://api.example.com" # 目标API需要的授权Token,建议存在Django settings配置文件中 TARGET_API_TOKEN = "你的目标API授权Token" @login_required @require_http_methods(["PUT"]) def campaign_approve_proxy(request): # 解析前端传的参数 req_data = json.loads(request.body) camp_id = req_data.get("camp_id") campaign_status = req_data.get("campaign_status") # 校验参数合法性 if not all([camp_id, campaign_status]): return JsonResponse({"error": "参数缺失"}, status=400) # 后端发起对目标API的请求 try: resp = requests.put( TARGET_API_URL, json={ "camp_id": camp_id, "campaign_status": campaign_status }, headers={ "Authorization": f"Bearer {TARGET_API_TOKEN}", "Content-Type": "application/json" }, timeout=10 ) # 将目标API的返回结果透传给前端 return JsonResponse(resp.json(), status=resp.status_code) except requests.exceptions.RequestException as e: return JsonResponse({"error": "请求目标接口失败"}, status=500)
在应用的urls.py中配置路由:
from django.urls import path from . import views urlpatterns = [ # 其他现有路径 path("api/proxy/campaign-approve/", views.campaign_approve_proxy, name="campaign_approve_proxy"), ]
效果说明
修改完成后,浏览器调试工具的网络面板只会显示/api/proxy/campaign-approve/这个你自己的接口路径,真实的https://api.example.com地址完全不会出现在前端任何地方,自然不会被捕获:
注意事项
- 不要尝试任何前端加密URL、混淆请求的方案,只要请求是从前端直接发出,最终的请求地址必然会被浏览器捕获,这类方案完全无效
- 代理接口一定要加权限校验(比如上面的
@login_required装饰器),避免未授权用户滥用你的代理接口 - 目标API的授权Token放在后端配置即可,不要泄露到前端
内容的提问来源于stack exchange,提问作者Muhammad Arsalan Toor
相关产品推荐
相关产品推荐

