我有一个激活用户帐户的API端点。它期望表单数据中有uid
和token
。
当然,期望用户发布到我的端点是UX缺陷
因此他们会收到一封电子邮件,其中包含用于激活其帐户的链接(包含uid
和token
)
like:http://example.com/api/auth/account/activate/{uid}/{token}
例如https://example.com/api/auth/account/activate/MzA/562-5bb096a051c6210994fd
因此,当单击该链接的视图时,会将其数据发布到API端点并返回模板页面。我正在执行的实现:
# urls.py
from django.urls import include, path
from . import views
urlpatterns = [
path('activate/<str:uid>/<str:token>', views.ActivationView.as_view(), name='activate')
]
# views.py
from django.views.generic.base import TemplateView
from djoser.views import ActivationView as DjoserActivationView
from django.test.client import RequestFactory
class ActivationView(TemplateView):
template_name = "users/activation.html"
def dispatch(self, request, *args, **kwargs):
form_data = {
'uid': kwargs['uid'],
'token': kwargs['token']
}
alt_request = RequestFactory().post('/api/auth/users/confirm/', form_data)
activate_view_response = DjoserActivationView.as_view()(alt_request)
kwargs['activation_status_code'] = activate_view_response.status_code
return super().dispatch(request, *args, **kwargs)
但是,我认为我不能像在这里那样使用RequestFactory
。我不知道有什么其他方法可以实现这一目标。 Django提供哪些选项?
答案 0 :(得分:0)
似乎ActivationView中的逻辑是作为单个方法_action
实现的。因此,您可以将自己的视图设为该视图的子类,然后在get
中调用该方法。
class ActivationView(DjoserActivationView):
template_name = "users/activation.html"
def get(self, request, **kwargs):
serializer = self.get_serializer(data=kwargs)
if serializer.is_valid():
response = self._action(serializer)
kwargs['activation_status_code'] = activate_view_response.status_code
return super().dispatch(request, *args, **kwargs)
注意,我对Djoser并不熟悉,我也不真正理解为什么他们首先希望您将其实现为POST。他们大概有这样做的充分理由,因此您应该仔细考虑是否真的要这样做。