本文介绍了Django Rest-创建自定义响应消息时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想实施电子邮件验证,并且使它正常工作的方式似乎很笨拙,但似乎工作良好。我已经在函数的返回部分中创建了一个自定义响应,但是我不断收到以下错误:

I want to implement an email verification and the way I have got it working seems "hacky" but it seems to work good. I've created a custom response in the return portion of the function, but I keep getting the following error:

The response content must be rendered before it can be iterated over.

该过程是某人注册的标准,当我保存用户模型时,我有一个 send_mail()函数,用于发送带有验证密钥的电子邮件。用户单击该链接,它会通过这样的密钥:

The process is the standard someone registers and when I go to save the User model I have a send_mail() function that sends out the email with a verification key. The user clicks the link and it passes the key like this:

/api/account/verify/849c40665175e56709855cc7aec2b16c05a4d977b3b083790334c6bc01f6e522

在视图中,您可以看到我从哪里拔出钥匙并进行了所有处理。我猜错是因为我在 get_queryset()中使用 Response(),但是我不确定。如果没有,该如何创建自定义回复消息?

In the view you can see where I pull the key out and process everything. I'm guessing the error is because I'm using Response() in get_queryset(), but I'm not sure. If not, how do I create a custom response message?

版本

Python==2.7.10
Django==1.11.4
djangorestframework==3.6.3

模型

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), null=False, unique=True)
    first_name = models.TextField(_('first name'), null=False)
    last_name = models.TextField(_('last name'), null=False)
    is_active = models.BooleanField(_('active'), default=False)
    is_admin = models.BooleanField(_('admin'), default=False)
    created_on = models.DateTimeField(_('create on'), auto_now_add=True)
    updated_on = models.DateTimeField(_('updated on'), auto_now=True)
    is_staff = models.BooleanField(_('staff'), default=False)
    activation_key = models.CharField(_('email validation key'), default='', max_length=256)

查看

class ActivateViewSet(generics.ListAPIView):

    queryset = User.objects
    serializer_class = ActivationSerializer

    def get_queryset(self):
        activation_key = self.kwargs['activation_key']
        if User.objects.all().filter(activation_key=activation_key).exists():
            User.objects.all().filter(activation_key=activation_key).update(is_active=True)
            return Response({'message': 'key accepted'}, status=status.HTTP_204_NO_CONTENT)
        raise NotFound('activation key not found')

序列化器

class ActivationSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('email',)

跟踪

文件_get_response
187中的 /Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/django/core/handlers/base.py。response = self.process_exception_by_middleware(e,request)

File "/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 187. response = self.process_exception_by_middleware(e, request)

_get_response $ b中的文件 /Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/django/core/handlers/base.py $ b185。响应= wraped_callback(request,* callback_args,** callback_kwargs)

File "/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 185. response = wrapped_callback(request, *callback_args, **callback_kwargs)

文件 /Users/*/.virtualenvs/video_env/lib/python2.7/在wrapd_view
58中返回 site-packages / django / views / decorators / csrf.py。return view_func(* args,** kwargs)

File "/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view 58. return view_func(*args, **kwargs)

文件 /视图
中的Users / * /。virtualenvs / video_env / lib / python2.7 / site-packages / django / views / generic / base.py68。return self.dispatch(request,* args,** kwargs )

File "/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/django/views/generic/base.py" in view 68. return self.dispatch(request, *args, **kwargs)

文件$ / b $ b 489中的文件 /Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/views.py。response = self.handle_exception(exc)

File "/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/views.py" in dispatch 489. response = self.handle_exception(exc)

handle_exception
449中的 /Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/views.py文件。 raise_uncaught_exception(exc)

File "/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/views.py" in handle_exception 449. self.raise_uncaught_exception(exc)

文件 /Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/views.py b $ b486。response = handler(request,* args,** kwargs)

File "/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/views.py" in dispatch 486. response = handler(request, *args, **kwargs)

File /Users/*/.virtualenvs/video_env/lib/python2.7 /site-packages/rest_framework/generics.py中获得
201。return self.list(request,* args,** kwargs)

File "/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/generics.py" in get 201. return self.list(request, *args, **kwargs)

File /Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/mixins.py在列表
中48。return Response(serializer.data)

File "/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/mixins.py" in list 48. return Response(serializer.data)

文件 /Users/*/.virtualenvs/video_env/lib/python2.7/s ite-packages / rest_framework / serializers.py放在数据
739中。ret = super(ListSerializer,self).data

File "/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/serializers.py" in data 739. ret = super(ListSerializer, self).data

文件​​ / Users / * / .virtualenvs / video_env / lib / python2.7 / site-packages / rest_framework / serializers.py放入数据
263。self._data = self.to_representation(self.instance)

File "/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/serializers.py" in data 263. self._data = self.to_representation(self.instance)

to_representation
657中的文件 /Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/serializers.py。self.child.to_representation(item)用于可迭代的项目

File "/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/serializers.py" in to_representation 657. self.child.to_representation(item) for item in iterable

文件 /Users/*y/.virtualenvs/video_env/lib/python2.7/site-packages/django/template/response.py在 iter
121中。必须先呈现响应内容,然后才能对其进行迭代。

File "/Users/*y/.virtualenvs/video_env/lib/python2.7/site-packages/django/template/response.py" in iter 121. 'The response content must be rendered before it can be iterated over.'

异常类型:ContentNotRenderedError,位于/ api / account / activate / 849c40665175e56709855cc7aec2b16c05a4d977b3b083790334c6bc01f6e522 /
异常值:必须呈现响应内容

Exception Type: ContentNotRenderedError at /api/account/activate/849c40665175e56709855cc7aec2b16c05a4d977b3b083790334c6bc01f6e522/ Exception Value: The response content must be rendered before it can be iterated over.


推荐答案

get_queryset 期望返回类型为 queryset 而不是 Response 对象。您需要将代码更改为类似

get_queryset expects a return type to be a queryset not a Response object. You need to change your code to something like

def get_queryset(self):
        activation_key = self.kwargs['activation_key']
        if User.objects.all().filter(activation_key=activation_key).exists():
            users = User.objects.all().filter(activation_key=activation_key)
                                      .update(is_active=True)
            return user

现在,因为您要发送自定义响应,则无法在 get_queryset 中完成。您必须重写序列化器的create方法。以下是有关如何覆盖此内容的一般示例。

Now since you want to send a custom response it can't be done in get_queryset. You have to override your serializer's create method. Below is a general example for how to override this.

def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        if not serializer.is_valid(raise_exception=False):
            return Response({"Fail": "blablal", status=status.HTTP_400_BAD_REQUEST)

        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response({"Success": "msb blablabla"}, status=status.HTTP_201_CREATED, headers=headers)

这篇关于Django Rest-创建自定义响应消息时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-27 15:45