使用中间件重定向

时间:2017-02-14 12:39:42

标签: django

如果不满足条件,我会写一个(新样式)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'

所以看起来我的中间件导致另一个中间件(它上面的中间件)失败。我在这里做错了什么?

0 个答案:

没有答案