在 django 中,我想在为视图调用 login_required() 之前执行特定操作。一种技巧或简单的方法是让该 url 指向不需要登录的视图并执行特定操作(操作:在 request.session 中设置一些内容),然后重定向回需要登录的主视图.
如果在 django 中有一些选项可以满足这些需求,我应该怎么做?
有没有比编写自己的装饰器更好或更简单的方法来做到这一点?
在 django 中,我想在为视图调用 login_required() 之前执行特定操作。一种技巧或简单的方法是让该 url 指向不需要登录的视图并执行特定操作(操作:在 request.session 中设置一些内容),然后重定向回需要登录的主视图.
如果在 django 中有一些选项可以满足这些需求,我应该怎么做?
有没有比编写自己的装饰器更好或更简单的方法来做到这一点?
装饰器是最好的方法,因为它使代码易于理解,并且出于安全原因,用户可以阻止重定向,因此您需要考虑如何避免这种情况。
这篇文章似乎很有用如何制作功能装饰器链?,因为我认为您需要传递请求变量并首先放置您的装饰器来处理检查。
您的问题没有提供太多细节,但是按照您的示例(设置一些请求变量),听起来您需要Request Middleware。看一下内置django.contrib.auth.middleware.AuthenticationMiddleware
的例子:
class AuthenticationMiddleware(object):
def process_request(self, request):
assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'."
request.user = SimpleLazyObject(lambda: get_user(request))
您需要使用该process_request
方法定义一个类(如上所示)。该process_request
方法将为每个请求调用,并传递一个请求实例。在该方法中,您可以检查request.user
用户是否已通过身份验证,并为当前请求设置所需的任何变量。
编写自己的装饰器是解决此问题的最佳方法。任何你有 @login_required 的地方,除了 login_required 装饰器之外,只需添加你自己的装饰器。
或者,您可以从装饰器中调用 login_required 函数。
只需使用user_passes_test
装饰器并在手动验证它们是否经过身份验证之前执行您的自定义操作。请参阅:https ://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.user_passes_test