21-Django中间件(禁止IP案例)

中间件

中间件函数是Django框架预留的函数接口,让我们可以改动请求的应答的过程

获取浏览器端的ip地址,禁止ip

使用request对象的META属性:request.META['REMOTE_ADDR']

禁止某些ip:

EXCLUDE_IPS = ['127.0.0.1']
def index(request):
    '''首页'''
    # 获取浏览器端的ip
    user_ip = request.META['REMOTE_ADDR']
    if user_ip in EXCLUDE_IPS:
        return HttpResponse('<h1>您的ip被禁止</h1>')
    return render(request,'booktest/index.html')

使用装饰器,使得全部页面禁止ip

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.

def blocked_ips(view_func):
    def wrapper(request,*view_args,**view_kwargs):
        user_ip = request.META['REMOTE_ADDR']
        if user_ip in EXCLUDE_IPS:
            return HttpResponse('<h1>您的ip被禁止</h1>')
        else:
            return view_func(request,*view_args,**view_kwargs)
    
    return wrapper

@blocked_ips
def static_test(request):
    return render(request,'booktest/static_test].html')

EXCLUDE_IPS = ['127.0.0.1']
@blocked_ips
def index(request):
    '''首页'''
    # 获取浏览器端的ip
    return render(request,'booktest/index.html')

通过中间件禁止IP

以上的方法是通过装饰器禁止IP的,实际上我们还可以通过中间件函数禁止IP.
在这里插入图片描述
在booktest应用下新建middleware.py文件.
定义中间件类,中间件类的名字可以自己起,但是类里面的中间件函数名不可以随便起,这些函数都是Django预留的接口.

from django.http import HttpResponse

class BlockedIPSMiddleware(object):
    '''中间件类'''
    EXCLUDE_IPS = ['127.0.0.1']
    def process_view(self,request,view_func,*view_args,**view_kwargs):
        '''中间件函数,视图函数调用之前会调用这个函'''
        user_ip = request.META['REMOTE_ADDR']
        if user_ip in BlockedIPSMiddleware.EXCLUDE_IPS:
            return HttpResponse('<h1>您的ip被禁止</h1>')
__init__:服务器相应第一个请求时候的调用
process_request:是在产生request对象,进行url匹配之前的调用
process_view:在url匹配之后,调用食欲函数之前
process_response:调用视图函数之后,内容返回给浏览器之前
process_exception:视图函数出现异常,会调用这个函数
如果注册的多个中间件类包含process_exception函数的时候,调用顺序和注册顺序相反

最后需要到setting.py,注册中间件类

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'booktest.middleware.BlockedIPSMiddleware',#注册中间件类
)

demo

middleware.py

class TestMiddleware(object):
    '''中间件类'''
    def __init__(self):
        '''服务器重启之后接受第一个请求时候调用'''
        print('__init__')

    def process_request(self,request):
        '''产生request之后,url匹配之前调用'''
        print('process_request中间件函数')

    def process_view(self,request,view_func,*view_args,**view_kwargs):
        '''url匹配之后,视图函数调用之前'''
        print('process_view')

setting.py

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'booktest.middleware.BlockedIPSMiddleware',#注册中间件类
    'booktest.middleware.TestMiddleware',
)

现在访问的时候看看后台的打印
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34788903/article/details/87967500