在 Django 中重用视图
reuse of views in django
我正在创建一个 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, *args, **kwargs)
return _wrapped_view
# ...
@requires_otp
def my_view(...):
pass
# or for CBVs:
... requires_otp(MyView.as_view()) ...
我正在创建一个 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, *args, **kwargs)
return _wrapped_view
# ...
@requires_otp
def my_view(...):
pass
# or for CBVs:
... requires_otp(MyView.as_view()) ...