Skip to main content
 首页 » 编程设计

python之原始数据异常 : You cannot access body after reading from request's data stream

2025年05月04日28del

我在 Google Cloud 上托管了一个站点,一切正常,但突然间我开始收到此错误。

01:16:22.222 
Internal Server Error: /api/v1/auth/login/ (/base/data/home/apps/s~crs-portal/1.395605052160854207/lib/django/core/handlers/exception.py:124) 
Traceback (most recent call last): 
  File "/base/data/home/apps/s~crs-portal/1.395605052160854207/lib/django/core/handlers/exception.py", line 39, in inner 
    response = get_response(request) 
  File "/base/data/home/apps/s~crs-portal/1.395605052160854207/lib/django/core/handlers/base.py", line 249, in _legacy_get_response 
    response = self._get_response(request) 
  File "/base/data/home/apps/s~crs-portal/1.395605052160854207/lib/django/core/handlers/base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
  File "/base/data/home/apps/s~crs-portal/1.395605052160854207/lib/django/core/handlers/base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
  File "/base/data/home/apps/s~crs-portal/1.395605052160854207/lib/django/views/decorators/csrf.py", line 58, in wrapped_view 
    return view_func(*args, **kwargs) 
  File "/base/data/home/apps/s~crs-portal/1.395605052160854207/lib/django/views/generic/base.py", line 68, in view 
    return self.dispatch(request, *args, **kwargs) 
  File "/base/data/home/apps/s~crs-portal/1.395605052160854207/lib/rest_framework/views.py", line 474, in dispatch 
    response = self.handle_exception(exc) 
  File "/base/data/home/apps/s~crs-portal/1.395605052160854207/lib/rest_framework/views.py", line 434, in handle_exception 
    self.raise_uncaught_exception(exc) 
  File "/base/data/home/apps/s~crs-portal/1.395605052160854207/lib/rest_framework/views.py", line 471, in dispatch 
    response = handler(request, *args, **kwargs) 
  File "/base/data/home/apps/s~crs-portal/1.395605052160854207/authentication/views.py", line 42, in post 
    data = json.loads(request.body) 
  File "/base/data/home/apps/s~crs-portal/1.395605052160854207/lib/rest_framework/request.py", line 359, in __getattribute__ 
    return getattr(self._request, attr) 
  File "/base/data/home/apps/s~crs-portal/1.395605052160854207/lib/django/http/request.py", line 263, in body 
    raise RawPostDataException("You cannot access body after reading from request's data stream") 
RawPostDataException: You cannot access body after reading from request's data stream 

我不知道这是什么意思,无休止的谷歌搜索并没有解决我的问题..

下面是可能相关的代码:

views.py

class LoginView(views.APIView): 
    def post(self, request, format=None): 
        data = json.loads(request.body) 
 
        email = data.get('email', None) 
        password = data.get('password', None) 
 
        account = authenticate(email=email, password=password) 
 
        if account is not None: 
            if account.is_active: 
                login(request, account) 
 
                serialized = AccountSerializer(account) 
 
                return Response(serialized.data) 
            else: 
                return Response({ 
                    'status': 'Unauthorized', 
                    'message': 'This account has been disabled.' 
                }, status=status.HTTP_401_UNAUTHORIZED) 
        else: 
            return Response({ 
                'status': 'Unauthorized', 
                'message': 'Username/password combination invalid.' 
            }, status=status.HTTP_401_UNAUTHORIZED) 

序列化器.py

class AccountSerializer(serializers.ModelSerializer): 
    password = serializers.CharField(write_only=True, required=False) 
    confirm_password = serializers.CharField(write_only=True, required=False) 
 
    class Meta: 
        model = Account 
        fields = ('id', 'email', 'username', 'created_at', 'updated_at', 'full_name', 'password', 'confirm_password') 
        read_only_fields = ('created_at', 'updated_at',) 
 
        def create(self, validated_data): 
            return Account.objects.create(**validated_data) 
 
        def update(self, instance, validated_data): 
            instance.username = validated_data.get('username', instance.username) 
 
            instance.save() 
 
            password = validated_data.get('password', None) 
            confirm_password = validated_data.get('confirm_password', None) 
 
            if password and confirm_password and password == confirm_password: 
                instance.set_password(password) 
                instance.save() 
 
            update_session_auth_hash(self.context.get('request'), instance) 
 
            return instance 

请您参考如下方法:

发生这种情况是因为您正试图从 body

访问数据

使用 -> data = json.loads(request.data)