自定义 Django 登录表单中间件
Custom Django login form middleware
我正在寻找一种实现模式弹出式登录表单的解决方案,以便在导航栏中的整个站点范围内使用。我正在使用 Django 1.11。现在,我定义了一个 LoginFormMiddleware class 如下:
middleware.py
from django.http import HttpResponseRedirect
from django.contrib.auth import login
from django.contrib.auth.forms import AuthenticationForm
class LoginFormMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_request(self, request):
from django.contrib.auth.forms import AuthenticationForm
if request.method == 'POST' and request.POST.has_key('base-account') and request.POST['base-account'] == 'Login':
form = AuthenticationForm(data=request.POST, prefix="login")
if form.is_valid():
from django.contrib.auth import login
login(request, form.get_user())
request.method = 'GET'
else:
form = AuthenticationForm(request, prefix="login")
request.login_form = form
MIDDLEWARE = []
中settings.py中的标准方式都包含了这些。我也在 TEMPLATES = [ { ... 'OPTIONS': { 'context_processors': [ *** ] } ]
中定义了 'django.template.context_processors.request',我应该这样做。
在我的模板中使用 {{ request.login_form }}
如下:
<div class="container">
{{ request.login_form }}
</div>
然而什么都没有渲染 - 它应该在哪里?来自浏览器检查器工具:
任何人都可以告诉我我缺少什么吗?
完整的中间件列表:
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',
'wagtail.wagtailcore.middleware.SiteMiddleware',
'wagtail.wagtailredirects.middleware.RedirectMiddleware',
'thinkingplace.middleware.LoginFormMiddleware',
]
process_request
来自老式的 Django 1.10 之前的中间件。您正在使用新型中间件,因此 Django 不会调用该方法。
您可以在调用 get_response
之前将该代码移动到 __call__
方法。
def __call__(self, request):
# code that sets request.login_form
return self.get_response(request)
但是,我不确定使用中间件是最好的方法。我会考虑创建一个上下文处理器,将登录表单添加到模板上下文,然后将登录请求提交到单个登录视图。
我正在寻找一种实现模式弹出式登录表单的解决方案,以便在导航栏中的整个站点范围内使用。我正在使用 Django 1.11。现在,我定义了一个 LoginFormMiddleware class 如下:
middleware.py
from django.http import HttpResponseRedirect
from django.contrib.auth import login
from django.contrib.auth.forms import AuthenticationForm
class LoginFormMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_request(self, request):
from django.contrib.auth.forms import AuthenticationForm
if request.method == 'POST' and request.POST.has_key('base-account') and request.POST['base-account'] == 'Login':
form = AuthenticationForm(data=request.POST, prefix="login")
if form.is_valid():
from django.contrib.auth import login
login(request, form.get_user())
request.method = 'GET'
else:
form = AuthenticationForm(request, prefix="login")
request.login_form = form
MIDDLEWARE = []
中settings.py中的标准方式都包含了这些。我也在 TEMPLATES = [ { ... 'OPTIONS': { 'context_processors': [ *** ] } ]
中定义了 'django.template.context_processors.request',我应该这样做。
在我的模板中使用 {{ request.login_form }}
如下:
<div class="container">
{{ request.login_form }}
</div>
然而什么都没有渲染 - 它应该在哪里?来自浏览器检查器工具:
任何人都可以告诉我我缺少什么吗?
完整的中间件列表:
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',
'wagtail.wagtailcore.middleware.SiteMiddleware',
'wagtail.wagtailredirects.middleware.RedirectMiddleware',
'thinkingplace.middleware.LoginFormMiddleware',
]
process_request
来自老式的 Django 1.10 之前的中间件。您正在使用新型中间件,因此 Django 不会调用该方法。
您可以在调用 get_response
之前将该代码移动到 __call__
方法。
def __call__(self, request):
# code that sets request.login_form
return self.get_response(request)
但是,我不确定使用中间件是最好的方法。我会考虑创建一个上下文处理器,将登录表单添加到模板上下文,然后将登录请求提交到单个登录视图。