python - 如何在不重复代码的情况下在 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
/viewset
并serializer
做到这一点(就像这个问题的答案一样),但这会违反DRY原则。鉴于已经有一个功能齐全的 Web 界面,实现 REST API 界面的最佳方式是什么?
解决方案
为 API 实现 Django rest 框架和标准 Django web 视图有点不同。我建议您为这些创建不同的端点。
推荐阅读
- c++ - 如何重用 Poco::Net::HTTPRequestHandler?
- python - Python:根据位置显示多张图像->显示图像时程序暂停
- javascript - 我如何要求 auth 访问某些组件?
- reactjs - 如何在 React 中的卡片中显示不同的图表
- asp.net-core - 在 Telerik 网格行中传递隐藏字段
- python - 根据python中的值对列表进行拆分
- javascript - 检查单击的元素是否打开弹出窗口
- set - 如何在 CPLEX 中编写此集合
- azure-devops - Azure DevOps 包含 yaml express 无法按预期工作
- java - NoClassDefFoundError 尽管在 post 21 SDK 上启用了 multiDex