You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动