我想实现电子邮件验证,并且使它正常工作的方式似乎很“hacky”,但似乎工作得很好。我在函数的返回部分中创建了一个自定义响应,但是我不断收到以下错误:
The response content must be rendered before it can be iterated over.
该过程是某人注册的标准,当我去保存用户模型时,我有一个
send_mail()
函数,该函数会发送带有验证 key 的电子邮件。用户单击该链接,它会通过如下所示的 key :/api/account/verify/849c40665175e56709855cc7aec2b16c05a4d977b3b083790334c6bc01f6e522
在 View 中,您可以看到我在哪里拔出 key 并进行所有处理。我猜错误是因为我在
Response()
中使用了get_queryset()
,但是我不确定。如果没有,如何创建自定义响应消息?版本
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_queryset
期望返回类型是queryset
而不是Response
对象。您需要将代码更改为类似
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方法。以下是有关如何覆盖此内容的一般示例。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)