From 3b3c1fb06a6c9849606e8b227120226da383dedc Mon Sep 17 00:00:00 2001 From: XingQue Date: Tue, 21 Jul 2026 22:43:28 +0800 Subject: [PATCH] =?UTF-8?q?=E7=82=B9=E5=8D=95=E5=95=86=E5=93=81=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=A4=9A=E9=80=94=E5=BE=84=E8=A7=A3=E6=9E=90token?= =?UTF-8?q?=E8=AF=86=E5=88=AB=E7=94=A8=E6=88=B7=EF=BC=9B=E6=9C=89=E9=82=80?= =?UTF-8?q?=E8=AF=B7=E4=BA=BA/=E6=89=AB=E7=A0=81=E5=8F=AA=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E9=9A=90=E8=97=8F=E5=BC=8F=EF=BC=8C=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E8=AF=AF=E5=9B=9E=E6=AD=A3=E5=B8=B8=E5=95=86=E5=93=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- shangpin/views.py | 60 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/shangpin/views.py b/shangpin/views.py index ef13e40..2ab40b8 100644 --- a/shangpin/views.py +++ b/shangpin/views.py @@ -6,7 +6,7 @@ from rest_framework.throttling import AnonRateThrottle from django.db import models from shangpin.models import ShangpinLeixing, ShangpinZhuanqu, Shangpin from utils.xcx_sys_config import get_shangpin_shenhe_zhuangtai -from utils.jwt_auth import OptionalYonghuidJWTAuthentication +from utils.jwt_auth import OptionalYonghuidJWTAuthentication, YonghuidJWTAuthentication from yonghu.models import UserMain, UserDashou import logging from rest_framework.permissions import AllowAny # 新增这行 @@ -33,10 +33,49 @@ class ShangpinHuoquView(APIView): authentication_classes = [OptionalYonghuidJWTAuthentication] permission_classes = [AllowAny] - def _resolve_shenhe_filter(self, request): - """扫码标记或打手有邀请人 → 强制隐藏式4;否则走体验开关。""" + def _extract_raw_token(self, request): + """Authorization / token 头 / body.token / query.token,兼容网关剥 Authorization。""" + auth = ( + request.META.get('HTTP_AUTHORIZATION') + or request.META.get('HTTP_TOKEN') + or request.META.get('HTTP_X_TOKEN') + or '' + ).strip() + if auth: + parts = auth.split() + return parts[-1] if parts else auth + body_token = '' + try: + body_token = (request.data.get('token') or '').strip() + except Exception: + body_token = '' + if body_token: + return body_token + return (request.query_params.get('token') or '').strip() + + def _resolve_request_user(self, request): + """优先用 DRF 已认证用户;否则手动解析 token。""" user = request.user if getattr(user, 'is_authenticated', False): + return user + raw = self._extract_raw_token(request) + if not raw: + logger.info('点单商品:请求未带token,无法识别用户') + return None + try: + from rest_framework_simplejwt.tokens import AccessToken + validated = AccessToken(raw) + user = YonghuidJWTAuthentication().get_user(validated) + logger.info('点单商品:手动解析token成功 yonghuid=%s', getattr(user, 'yonghuid', '')) + return user + except Exception as exc: + logger.warning('点单商品:token无效 %s', exc) + return None + + def _resolve_shenhe_filter(self, request): + """扫码标记或打手有邀请人 → 强制隐藏式4;否则走体验开关。""" + user = self._resolve_request_user(request) + if user is not None: yonghuid = getattr(user, 'yonghuid', '') saoma = UserMain.objects.filter(pk=user.pk).values_list('guanshi_saoma', flat=True).first() if saoma == 1: @@ -57,12 +96,11 @@ class ShangpinHuoquView(APIView): ) return 4 logger.info( - '点单商品:未扫码且无打手邀请人 guanshi_saoma=%s yonghuid=%s', + '点单商品:已识别用户但未扫码且无打手邀请人 guanshi_saoma=%s yonghuid=%s dashou=%s', saoma, yonghuid, + bool(dashou), ) - else: - logger.info('点单商品:未登录/无token,按体验开关筛选') shenhe = get_shangpin_shenhe_zhuangtai() logger.info('点单商品:按体验开关 shenhezhuangtai=%s', shenhe) return shenhe @@ -136,9 +174,13 @@ class ShangpinHuoquView(APIView): "shangpinliebiao": shangpinliebiao_data } - logger.info(f"返回数据:类型{len(shangpinleixing_data)}个," - f"专区{len(shangpinzhuanqu_data)}个," - f"商品{len(shangpinliebiao_data)}个") + logger.info( + '返回商品数据 filter=%s 类型=%s 专区=%s 商品=%s', + shenhe_filter, + len(shangpinleixing_data), + len(shangpinzhuanqu_data), + len(shangpinliebiao_data), + ) # 5. 返回响应 return Response(response_data, status=status.HTTP_200_OK)