首页 > 解决方案 > 如何在不重复代码的情况下在 Django Rest Framework 中实现密码更改(DRY 原理)

问题描述

我有一个 Django 应用程序,它已经有一个用于更改密码的 Web 界面。它使用django.contrib.auth函数和django.views.generic.UpdateView. 这是代码:

class PasswordChangeView(LoginRequiredMixin, generic.UpdateView):
    form_class = PasswordChangeForm
    template_name = 'form.html'
    input_value = 'update password'

    def post(self, request, *args, **kwargs):
        form = PasswordChangeForm(request.user, request.POST)
        if form.is_valid():
            user = form.save()
            update_session_auth_hash(request, user)  # Important!
            try:
                request.user.auth_token.delete()  # Important!
            except (AttributeError, ObjectDoesNotExist):
                pass
            messages.success(request, 'Your password was successfully updated!')
            return redirect('/')
        else:
            messages.error(request, 'Please correct the error below.')

    def get(self, request, **kwargs):
        form = PasswordChangeForm(request.user)
        return render(request, self.template_name, {'form': form, 'input_value': self.input_value})

上面的代码在 Web 界面中运行良好。现在我想实现 REST API 来更改密码。我知道我可以创建APIView/viewsetserializer做到这一点(就像这个问题的答案一样),但这会违反DRY原则。鉴于已经有一个功能齐全的 Web 界面,实现 REST API 界面的最佳方式是什么?

标签: pythondjangodjango-rest-frameworkdjango-views

解决方案


为 API 实现 Django rest 框架和标准 Django web 视图有点不同。我建议您为这些创建不同的端点。


推荐阅读