如果不满足条件,我会写一个(新样式)Django中间件来将用户重定向到特定视图。在这种情况下,request.session['sms_verified']
必须为真:
class SMSVerificationMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.user.is_authenticated and request.user.email_verified:
if not request.session.get('sms_verified'):
verification_code = random.randint(100000,999999)
print('SMS verification code: ' + str(verification_code))
request.user.sms_verification_code = verification_code
request.user.save()
return redirect('users:sms_verification')
else:
print('SMS verified')
return self.get_response(request)
else:
return self.get_response(request)
在需要时重定向到SMS验证视图,但此视图会引发错误:
AttributeError at /sms_verificatie/
'NoneType' object has no attribute 'get'
Request Method: GET
Request URL: http://127.0.0.1:8000/sms_verificatie/
Django Version: 1.11a1
Exception Type: AttributeError
Exception Value: 'NoneType' object has no attribute 'get'
Exception Location: C:\Users\Administrator\SVN\venvs\venv_valportal\lib\site-packages\django\middleware\clickjacking.py in process_response, line 32
Python Executable: C:\Users\Administrator\SVN\venvs\venv_valportal\Scripts\python.exe
Python Version: 3.6.0
Python Path:
['C:/Users/Administrator/SVN/valportal',
'C:\\Program Files (x86)\\JetBrains\\PyCharm 2016.3.2\\helpers\\pydev',
'C:\\Users\\Administrator\\SVN\\valportal',
'C:\\Program Files (x86)\\JetBrains\\PyCharm 2016.3.2\\helpers\\pydev',
'C:\\Users\\Administrator\\SVN\\venvs\\venv_valportal\\Scripts\\python36.zip',
'C:\\Users\\Administrator\\SVN\\venvs\\venv_valportal\\DLLs',
'C:\\Users\\Administrator\\SVN\\venvs\\venv_valportal\\lib',
'C:\\Users\\Administrator\\SVN\\venvs\\venv_valportal\\Scripts',
'c:\\python36-32\\Lib',
'c:\\python36-32\\DLLs',
'C:\\Users\\Administrator\\SVN\\venvs\\venv_valportal',
'C:\\Users\\Administrator\\SVN\\venvs\\venv_valportal\\lib\\site-packages']
Server time: di, 14 Feb 2017 13:35:29 +0100
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/sms_verificatie/
Django Version: 1.11a1
Python Version: 3.6.0
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'crispy_forms',
'frontend',
'users',
'public',
'patient',
'pharmacy',
'manager']
Installed 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',
'users.middleware.SMSVerificationMiddleware']
Traceback:
File "C:\Users\Administrator\SVN\venvs\venv_valportal\lib\site-packages\django\core\handlers\exception.py" in inner
38. response = get_response(request)
File "C:\Users\Administrator\SVN\venvs\venv_valportal\lib\site-packages\django\utils\deprecation.py" in __call__
142. response = self.process_response(request, response)
File "C:\Users\Administrator\SVN\venvs\venv_valportal\lib\site-packages\django\middleware\clickjacking.py" in process_response
32. if response.get('X-Frame-Options') is not None:
Exception Type: AttributeError at /sms_verificatie/
Exception Value: 'NoneType' object has no attribute 'get'
所以看起来我的中间件导致另一个中间件(它上面的中间件)失败。我在这里做错了什么?