django - Django rest-auth:从其他视图集调用 RegisterView;sensitive_post_parameters 没有收到 HttpRequest
问题描述
在由 django-rest-framework 提供支持的应用程序中,我使用 django-rest-auth 和 allauth 来处理用户注册等。一切正常。
我有一个处理用户推荐的 API 端点。这个想法是,如果在我的网站上没有帐户的人正在添加推荐信,我想自动为他/她创建一个帐户(如果输入了电子邮件)并且应该发送欢迎电子邮件,创建个人资料等.
因此,从处理添加推荐的视图集中,我像这样调用 RegisterView;这是帖子:
from rest_auth.registration.views import RegisterView
class AddTestimonialView(viewsets.ModelViewSet):
serializer_class = TestimonialSerializer
queryset = Testimonial.objects.all()
permission_classes = [permissions.AllowAny, ]
def create(self, request, *args, **kwargs):
................
RegisterView.as_view()(self.request)
但我收到一个错误:
AssertionError at /api/auth/testimonial/add/
sensitive_post_parameters didn't receive an HttpRequest. If you are decorating a classmethod, be sure to use @method_decorator.
似乎我应该创建一个自定义类并覆盖 RegisterView 的某些方法,可能会分派。但无法弄清楚我到底应该做什么。事实上,该请求根本没有敏感数据,只有电子邮件、姓名、证明文本等。没有密码或令牌。
这是来自 RegisterView @ rest_auth.registration.views 的原始代码:
sensitive_post_parameters_m = method_decorator(
sensitive_post_parameters('password1', 'password2')
)
class RegisterView(CreateAPIView):
serializer_class = RegisterSerializer
permission_classes = register_permission_classes()
token_model = TokenModel
@sensitive_post_parameters_m
def dispatch(self, *args, **kwargs):
return super(RegisterView, self).dispatch(*args, **kwargs)
def get_response_data(self, user):
if allauth_settings.EMAIL_VERIFICATION == \
allauth_settings.EmailVerificationMethod.MANDATORY:
return {"detail": _("Verification e-mail sent.")}
if getattr(settings, 'REST_USE_JWT', False):
data = {
'user': user,
'token': self.token
}
return JWTSerializer(data).data
else:
return TokenSerializer(user.auth_token).data
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(self.get_response_data(user),
status=status.HTTP_201_CREATED,
headers=headers)
def perform_create(self, serializer):
user = serializer.save(self.request)
if getattr(settings, 'REST_USE_JWT', False):
self.token = jwt_encode(user)
else:
create_token(self.token_model, user, serializer)
complete_signup(self.request._request, user,
allauth_settings.EMAIL_VERIFICATION,
None)
return user
有任何想法吗?谢谢
解决方案
你可以替换:
RegisterView.as_view()(self.request)
和
serializer = RegisterSerializer(data=self.request.data)
serializer.is_valid(raise_exception=True)
user = self.perform_create(serializer)
?
推荐阅读
- phpmyadmin - 我们可以将 PHPMYADMIN 与多个 PHP 版本一起使用吗?
- python - 在层次聚类中确定聚类中心
- sqlite - SQLite返回排名值python
- apache-spark - 带有 AM Container 限制错误的 pyspark 错误
- javascript - 无法解析模块 react-native-reanimated/src/core/AnimatedEvent
- reactjs - Styled-components 不适用于反应
- sql - 避免 MERGE 问题的解决方法是什么,即 MERGE 语句的目标不能是远程表?
- osdev - 长模式外部中断导致#GP故障
- java - 我必须将 https://datatracker.ietf.org/doc/html/draft-cavage-http-signatures-10 实施到 Springboot REST 端点
- python - Tkinter mainloop()在关闭窗口后没有退出