使用
http_request.user.is_authenticated
检查用户是否已登录。如果已登录,则现在可以访问http_request.user.id。如果未登录,则跳过需要用户身份验证的检查。
我在你的代码中添加了两件应该有帮助的事情
1.尝试除UUID验证之外的其他操作
2.已检查http_request.user.is_authenticated
3.未经身份验证的用户的后备方案
4.如果经过身份验证的组访问或有效价格,则拒绝访问响应
订阅未满足
from django.http import JsonResponse
from django.db.models import Q, Prefetch
from itertools import chain
from uuid import UUID
def get(http_request: HttpRequest, id: str):
try:
book_account_id = UUID(id)
except ValueError:
return JsonResponse({
"code": 400,
"error": True,
"messages": ["Invalid book account ID."],
"data": None,
}, status=400)
affiliated_price_subscriptions = None
response = BookAccountService.filter(
id=book_account_id
).prefetch_related(
Prefetch(
'subscription_set',
queryset=SubscriptionRepository.filter(
active=True
).prefetch_related(
Prefetch(
'pricesubscription_set',
queryset=PriceSubscriptionRepository.filter(
Q(status=PriceSubscription.PriceSubscriptionStatus.PENDING) |
Q(status=PriceSubscription.PriceSubscriptionStatus.REQUIRES_PAYMENT)
),
to_attr='price_subscriptions'
)
),
to_attr='subscriptions'
)
).first()
if response:
affiliated_price_subscriptions = list(chain.from_iterable(
subscription.price_subscriptions for subscription in response.subscriptions
))
if http_request.user.is_authenticated:
user_id = http_request.user.id
if PersonGroupService.exists(
person__user_id=user_id,
group__bookaccount__id=book_account_id
):
return JsonResponse({
"code": 200,
"error": False,
"messages": ["Access granted."],
"data": response,
}, status=200)
if affiliated_price_subscriptions:
return JsonResponse({
"code": 200,
"error": False,
"messages": ["Access granted based on price subscriptions."],
"data": response,
}, status=200)
return JsonResponse({
"code": 403,
"error": True,
"messages": ["Access denied."],
"data": None,
}, status=403)