问题描述
我正在创建一个 django 站点,我在登录时使用 OTP(一次性密码)来验证用户数据。所以我有一个视图,我在其中管理登录名和一个通过电子邮件发送 otp 的视图,提供表单,检查 otp正确并将用户重定向到主页。现在我也想在其他情况下重用 otp 视图(例如密码更改或恢复)。在从另一个视图中调用它、呈现模板并将值返回给调用视图的意义上,我如何像使用普通函数一样使用视图?
提前致谢
解决方法
让它成为装饰器。例如。您可能使用过的 @login_required
装饰器由 user_passes_test()
支持;您的 @otp_required
装饰器可以有更多逻辑,并且只有在您的 OTP 魔法通过后才遵循原始视图函数。
像这样的东西,作为半伪代码。它没有什么特别的魔法,真的——视图函数装饰器只是简单地包装了视图,所以它可以做任何视图可以做的事情。
from functools import wraps
class OtpView(views.FormView):
pass
def requires_otp(view_func):
@wraps(view_func)
def _wrapped_view(request,*args,**kwargs):
if not has_valid_otp_for_request(request):
return OtpView.as_view()(request)
return view_func(request,**kwargs)
return _wrapped_view
# ...
@requires_otp
def my_view(...):
pass
# or for CBVs:
... requires_otp(MyView.as_view()) ...