在 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,**kwargs)
    return _wrapped_view

# ...

@requires_otp
def my_view(...):
   pass

# or for CBVs:

... requires_otp(MyView.as_view()) ...