Mik*_*ike 7 python django django-rest-framework
我想实现一个电子邮件验证,我的工作方式似乎"hacky",但似乎工作得很好.我在函数的返回部分创建了一个自定义响应,但是我一直收到以下错误:
The response content must be rendered before it can be iterated over.
Run Code Online (Sandbox Code Playgroud)
该过程是有人注册的标准,当我去保存用户模型时,我有一个send_mail()功能,用验证密钥发送电子邮件.用户单击该链接并传递密钥,如下所示:
/api/account/verify/849c40665175e56709855cc7aec2b16c05a4d977b3b083790334c6bc01f6e522
Run Code Online (Sandbox Code Playgroud)
在视图中,您可以看到我拉出密钥的位置并处理所有内容.我猜的错误是因为我使用Response()的get_queryset(),但我不知道.如果没有,我该如何创建自定义响应消息?
版本
Python==2.7.10
Django==1.11.4
djangorestframework==3.6.3
Run Code Online (Sandbox Code Playgroud)
模型
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)
Run Code Online (Sandbox Code Playgroud)
视图
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')
Run Code Online (Sandbox Code Playgroud)
串行
class ActivationSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('email',)
Run Code Online (Sandbox Code Playgroud)
追溯
文件"/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/django/core/handlers/exception.py"在内部41. response = get_response(request)
文件"/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/django/core/handlers/base.py"在_get_response 187. response = self.process_exception_by_middleware(e,request)
_get_response 185中的文件"/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/django/core/handlers/base.py".response = wrapped_callback(request,*callback_args,**callback_kwargs)
在wrapped_view 58中输入文件"/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/django/views/decorators/csrf.py".返回view_func(*args,**kwargs)
在视图68中输入文件"/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/django/views/generic/base.py".返回self.dispatch(request,*args,**kwargs)
在调度489中输入文件"/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/views.py".response = self.handle_exception(exc)
handle_exception中的文件"/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/views.py"449. self.raise_uncaught_exception(exc)
在dispatch 486中输入文件"/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/views.py".response = handler(request,*args,**kwargs)
获取201中的文件"/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/generics.py".返回self.list(request,*args,**kwargs)
在列表48中输入文件"/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/mixins.py".返回Response(serializer.data)
在数据739中输入文件"/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/serializers.py".ret = super(ListSerializer,self).data
在数据263中输入文件"/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/serializers.py".self._data = self.to_representation(self.instance)
to_representation 65中的文件"/Users/*/.virtualenvs/video_env/lib/python2.7/site-packages/rest_framework/serializers.py".可迭代项目的self.child.to_representation(item)
在iter 121中输入文件"/Users/*y/.virtualenvs/video_env/lib/python2.7/site-packages/django/template/response.py".'响应内容必须在迭代之前呈现.'
异常类型:ContentNotRenderedError at/api/account/activate/849c40665175e56709855cc7aec2b16c05a4d977b3b083790334c6bc01f6e522/Exception Value:响应内容必须在迭代之前呈现.
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
Run Code Online (Sandbox Code Playgroud)
现在,由于您要发送自定义响应,因此无法在中完成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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4343 次 |
| 最近记录: |