在 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()) ...