Python Django中间件
我该怎么办,我的网站的整个URL只供注册用户使用。 我使用中间件,但这个类不起作用 我使用Django==2.1.4Python Django中间件,python,django,Python,Django,我该怎么办,我的网站的整个URL只供注册用户使用。 我使用中间件,但这个类不起作用 我使用Django==2.1.4 class MyAuthorization: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): response = self.get_response(request)
class MyAuthorization:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response
def process_request(request):
if not request.user.is_authenticated():
return HttpResponseRedirect('/') # or http response
return None
设置.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'myapp.middleware.MyAuthorization',
]中间件类中的
process\u request
方法永远不会被调用-Django中没有任何东西可以调用这种方法。在调用get\u response()
之前,您需要在\u call\u
方法本身中执行该逻辑,如下所示:
class MyAuthorization:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if not request.user.is_authenticated: # Note, this is a property, not a method
if not request.path == '/':
return HttpResponseRedirect('/')
response = self.get_response(request)
return response
注意第二条
if
语句-if not request.path='/'
-这是为了确保不会得到无限重定向。您可能需要使用类似的逻辑将您的登录视图从该检查中排除,否则注销的用户将永远无法访问它。正如@solarismoke所述,您应该使用\uuuu call\uuuu
而不是process\u request
def __call__(self, request):
if not request.user.is_authenticated():
return HttpResponseRedirect('/')
此外,如果用户未通过身份验证,您只是重定向到“/”,这可能会给人一种什么也没有发生的印象
也许您应该重定向到您的登录视图。您可以发布中间件的订单吗?您的自定义中间件是在django.contrib.auth.middleware.AuthenticationMiddleware之后吗?另外,您的自定义中间件有哪些“不起作用”。您是否收到错误消息?我在列表末尾发布了中间件=['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.messages.middleware.MessageMiddleware','djangoiddleware.clickjacking.xframeoptions中间件“,”myapp.middleware.MyAuthorization“,]好的,请将您的中间件列表也添加到问题的上下文中。如果您将调试
打印(“我在这里”)
在处理请求
函数中的语句,它是否打印到您的服务器控制台?我尝试过这样做,但不起作用,它会持续重定向。您需要从检查中排除登录/主页URL。我已更新了答案,以说明如何从检查中排除特定URL。