如何在Django中调用需基础认证(用户名、密码)的第三方API并获取数据
在Django中使用基础认证调用第三方API获取数据
嗨,这个需求我在项目里碰到过好几次,其实实现起来挺简单的,给你分享几种常用的靠谱方案:
方法1:使用requests库的HTTPBasicAuth(推荐)
这是最省心的方式,requests库已经帮我们封装好了基础认证的逻辑,不用自己手动处理编码。
首先确保你已经安装了requests:
pip install requests
然后可以在Django的视图函数、工具类或者管理命令里写这样的代码:
import requests from requests.auth import HTTPBasicAuth from django.conf import settings from django.http import JsonResponse def get_third_party_data(request): # 从settings里读取认证信息,绝对不要硬编码在代码里! api_url = "你的第三方API地址" api_user = settings.THIRD_PARTY_API_USERNAME api_pass = settings.THIRD_PARTY_API_PASSWORD try: # 发起带基础认证的GET请求 response = requests.get( api_url, auth=HTTPBasicAuth(api_user, api_pass) ) # 检查响应状态码,4xx/5xx会自动抛出异常 response.raise_for_status() # 假设API返回JSON格式数据,根据实际情况调整 data = response.json() return JsonResponse({"data": data}) except requests.exceptions.RequestException as e: # 捕获所有请求异常,返回友好错误提示 return JsonResponse({"error": f"请求失败: {str(e)}"}, status=500)
为了安全,把敏感信息放在Django的settings.py里,最好用环境变量配置:
# settings.py import os THIRD_PARTY_API_USERNAME = os.environ.get("THIRD_PARTY_API_USER") THIRD_PARTY_API_PASSWORD = os.environ.get("THIRD_PARTY_API_PASS")
方法2:手动构造Authorization请求头
如果想搞清楚底层逻辑,或者需要自定义请求头,可以手动构造基础认证的Authorization字段。
基础认证的原理是把用户名:密码用base64编码,拼在Basic 后面作为请求头的值,代码示例:
import requests import base64 from django.conf import settings from django.http import JsonResponse def get_third_party_data(request): api_url = "你的第三方API地址" api_user = settings.THIRD_PARTY_API_USERNAME api_pass = settings.THIRD_PARTY_API_PASSWORD # 编码认证信息 credentials = f"{api_user}:{api_pass}".encode("utf-8") encoded_cred = base64.b64encode(credentials).decode("utf-8") headers = { "Authorization": f"Basic {encoded_cred}" } try: response = requests.get(api_url, headers=headers) response.raise_for_status() data = response.json() return JsonResponse({"data": data}) except requests.exceptions.RequestException as e: return JsonResponse({"error": f"请求失败: {str(e)}"}, status=500)
关键注意事项
- 绝对不要硬编码敏感信息:用户名和密码一定要放在环境变量或者Django的settings里,避免提交到代码仓库泄露。
- 异常处理不能少:网络请求很容易出问题(超时、API报错等),一定要用try-except捕获异常,给用户返回友好提示,同时可以用Django的日志系统记录错误详情。
- 灵活适配API需求:如果API需要POST请求,把
requests.get换成requests.post,并传递data或者json参数即可。
异步视图中的实现(可选)
如果你的Django项目用了异步视图(Django 3.1+支持),可以用aiohttp代替requests,避免阻塞线程:
import aiohttp import base64 from django.conf import settings from django.http import JsonResponse from django.views.decorators.http import require_GET @require_GET async def async_get_third_party_data(request): api_url = "你的第三方API地址" api_user = settings.THIRD_PARTY_API_USERNAME api_pass = settings.THIRD_PARTY_API_PASSWORD credentials = base64.b64encode(f"{api_user}:{api_pass}".encode()).decode() headers = {"Authorization": f"Basic {credentials}"} try: async with aiohttp.ClientSession() as session: async with session.get(api_url, headers=headers) as response: if response.status == 200: data = await response.json() return JsonResponse({"data": data}) else: return JsonResponse({"error": f"API返回错误: {response.status}"}, status=response.status) except aiohttp.ClientError as e: return JsonResponse({"error": f"请求失败: {str(e)}"}, status=500)
内容的提问来源于stack exchange,提问作者Rika Das




