【问题标题】:how to send reset password email at the creation of my user in django API?如何在 django API 中创建我的用户时发送重置密码电子邮件?
【发布时间】:2021-09-28 15:50:21
【问题描述】:

我使用 django 构建了一个 API,并在使用 Sendinblue 创建一个用户时自动发送欢迎电子邮件。这一步我没有问题。 (所以我们的网址是/add_user/

我有第二个网址可以向用户发送链接(uid + 令牌)(感谢他的电子邮件)。为此,我使用了一个外部包:djoser。所以我使用了djoser/auth/users/reset_password//auth/users/reset_password_confirm/的url

我的梦想是将/reset_password//add_user/ 结合在一个网址中/add_user/ 我的问题是 /reset_password//reset_password_confirm/ 中的逻辑是由 djoser 编写的,所以我无法处理。或者我不知道怎么做!


这是我试图覆盖 djoser 视图的内容:

在 urls.py 中:

   path('custom_djoser/', ChangeCredentialsView.as_view(), name='customdjoser'),

在views.py中:

class ChangeCredentialsView(UserViewSet):
    def post(self, *args, **kwargs):
        print("hello world")
        return JsonResponse({"helloworld":"success"})

出现以下错误:

在调用 .as_view() 时必须提供 actions 参数 视图集。例如 .as_view({'get': 'list'})

所以我删除了 urls.py 中的 .as_view() 并得到了这个错误:

禁止(CSRF 令牌丢失或不正确。):/custom_djoser/

对我来说它是不可理解的,因为我不使用 csrf 令牌,但我尝试在我的类中的调度函数中使用 @csrf_exempt。我试图用授权令牌将class ChangeCredentialsView(UserViewSet, APIView): 定义为我的另一个类。无事可做,每次使用 csrf 令牌出错。 我可能会探索一种非常痛苦和愚蠢的方法来做我想做的事情,请告诉我是否有更简单的方法来做到这一点!

【问题讨论】:

  • 不可能将reset_passwordreset_password_confirm 合并到一个视图中,因为中间有一个中间步骤,需要用户在前端重置密码。最多,您可以在add_user 视图中实现reset_password 功能,并让前端应用程序将数据发布到reset_password_confirm 路由。要将reset_password 功能添加到您的add_user 视图中,请参阅here
  • 感谢您的帮助,是的,您是对的,我编辑了我的帖子,因为我只想结合 reset_password 和 add_user
  • 好的,你的add_user 视图和序列化器是什么样的?因为您需要添加的只是在创建用户后从 djoser 的存储库向视图/序列化器发送电子邮件代码。
  • 我给你看了答案,因为对评论来说太大了

标签: python django djoser sendinblue


【解决方案1】:

@Scratch'N'Purr 由于 cmets 空间不足,我在这里回复你:

目前我的add_user 视图看起来像这样(最重要的部分,因为它很大)

class AddUserView(generics.CreateAPIView, APIView):
    def post(self, request):
               newUser = User(
                username    = request.POST.get('username'),
                password    = request.POST.get('password'),
                email       = request.POST.get('email'),
                image       = request.FILES['image'],
                full_name   = request.POST.get('full_name'),
                user_type   = request.POST.get('usertype'),
                contact_number = request.POST.get('phone')
            )
            newUser.save()
 
      **** then lines of code to send email with Sendinblue ****

通常我使用 request.data 来获取请求正文,但这里有一个文件,所以我不得不使用 formdata。 而且我不得不承认我对序列化程序了解不多,也不会使用它

【讨论】:

  • 最好在将数据发送到创建对象之前使用序列化器,因为序列化器可以在将数据传递给模型之前对数据进行验证。由于您的数据包含 formdata,因此您可以修改视图的解析器类。也许看看这个answer 以获得一些灵感。
猜你喜欢
  • 1970-01-01
  • 2015-04-24
  • 2021-03-08
  • 2021-08-05
  • 2013-12-18
  • 1970-01-01
  • 2020-09-26
  • 2019-12-01
  • 1970-01-01
相关资源
最近更新 更多