如何在Python中实现Django用户关联API登录并获取对应权限文档
解决方案
你的核心问题是请求API时没传递当前登录用户的身份信息,导致API无法识别请求者;同时还需要实现「普通用户看对应标签文档、管理员看全部」的权限逻辑,下面是具体实现步骤:
1. 先给Django用户绑定API凭证和标签ID
首先需要给每个用户存储对应的API登录凭证和专属标签ID,通过扩展用户模型实现:
# models.py from django.contrib.auth.models import User from django.db import models class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) api_token = models.CharField(max_length=255) # 存储用户的API认证Token tag_id = models.IntegerField() # 存储用户对应的标签ID
执行数据库迁移后,给每个普通用户配置好对应的api_token和tag_id,管理员的tag_id可以设为特殊值(比如0)或者留空。
2. 修改视图函数,实现身份验证和权限过滤
在请求API时带上认证信息,同时根据用户类型添加标签过滤参数:
@login_required def f_facturaspendientes(request): url = 'http://host.docker.internal/api/v4/documents/' user_profile = request.user.userprofile # 构造API认证头(假设API用Token认证,若用其他方式需调整) headers = {'Authorization': f'Token {user_profile.api_token}'} params = {} # 根据用户类型设置过滤规则 if not (request.user.is_superuser or request.user.is_staff): # 普通用户仅请求自己标签ID的文档 params['tag_id'] = user_profile.tag_id try: # 带认证信息和过滤参数请求API response = requests.get(url, headers=headers, params=params) if response.status_code == 200: data = response.json() return JsonResponse({'message': 'Solicitud exitosa', 'data': data}) else: return JsonResponse({ 'error': 'API请求失败', 'status_code': response.status_code, 'api_error': response.text }) except Exception as e: return JsonResponse({'error': str(e)})
注意事项
- 如果目标API用的是Session认证而非Token,需要先调用API的登录接口获取Session Cookie,再在后续请求中携带
- 若API的标签过滤参数不是
tag_id,需要替换为API文档指定的参数名 - 管理员权限判断可根据实际需求调整(比如用自定义权限组替代默认的
is_staff)
内容的提问来源于stack exchange,提问作者Julian Buxton
相关产品推荐
相关产品推荐

