python全栈,  后端开发

django 自定义中间件

除了django自带的一些中间件外,我们还可以自定义一些中间件来满足我们的一些需求,比如下面例子,可以获取用户的请求IP,并直接返回,不需要到后端的views进行处理。

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',
    'm1.M1',
]

m1.py

from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
        def process_request(self, request):
        print(request.environ)
        # {'COMMAND_MODE': 'unix2003', 'HOME': '/Users/mac', 'ZDOTDIR': '', '__CF_USER_TEXT_ENCODING': '0x1F5:0x19:0x34', 'LOGIN_SHELL': '1', 'PATH': '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public', 'USER': 'mac', 'SSH_AUTH_SOCK': '/private/tmp/com.apple.launchd.CH8SNIRRSO/Listeners', '__INTELLIJ_COMMAND_HISTFILE__': '/Users/mac/Library/Application Support/JetBrains/PyCharm2020.1/terminal/history/history-239', 'TMPDIR': '/var/folders/_r/bbc2x5sd2hvcj55g4mbfh92h0000gn/T/', 'SHELL': '/bin/zsh', 'LOGNAME': 'mac', 'XPC_SERVICE_NAME': '0', 'LC_CTYPE': 'zh_CN.UTF-8', 'XPC_FLAGS': '0x0', '__CFBundleIdentifier': 'com.jetbrains.pycharm', 'TERM': 'xterm-256color', 'TERMINAL_EMULATOR': 'JetBrains-JediTerm', 'SHLVL': '1', 'PWD': '/Users/mac/Desktop/Code/test/django_test/dj_test', 'OLDPWD': '/Users/mac/Desktop/Code/test/django_test', '_': '/usr/local/bin/python3', 'DJANGO_SETTINGS_MODULE': 'dj_test.settings', 'TZ': 'UTC', 'RUN_MAIN': 'true', 'SERVER_NAME': '1.0.0.127.in-addr.arpa', 'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '80', 'REMOTE_HOST': '', 'CONTENT_LENGTH': '', 'SCRIPT_NAME': '', 'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'WSGIServer/0.2', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/', 'QUERY_STRING': '', 'REMOTE_ADDR': '192.168.33.108', 'CONTENT_TYPE': 'text/plain', 'HTTP_HOST': '192.168.33.108', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:85.0) Gecko/20100101 Firefox/85.0', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_COOKIE': 'csrftoken=eErHzZWzwe2bSKp5JmVfmfpdwAL5kdXdZW0G2SxBNiFAJD8fe7zPiVEJ7pZoZY0m', 'HTTP_UPGRADE_INSECURE_REQUESTS': '1', 'HTTP_CACHE_CONTROL': 'max-age=0', 'wsgi.input': <django.core.handlers.wsgi.LimitedStream object at 0x7ff65ed0f070>, 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf-8'>, 'wsgi.version': (1, 0), 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>, 'CSRF_COOKIE': 'eErHzZWzwe2bSKp5JmVfmfpdwAL5kdXdZW0G2SxBNiFAJD8fe7zPiVEJ7pZoZY0m'}
        print('m1.process_request')
        if request.environ['REMOTE_ADDR'] == "192.168.33.108":
            return HttpResponse("对不起,您在进行非法请求!")

    def process_response(self, request, response):
        print('m1.process_response')

        return response

file

file

留言

您的电子邮箱地址不会被公开。 必填项已用*标注

闽ICP备20008591号-1