我正在try 创建中间件,以便有 Select 地将kwarg传递给满足条件的每个视图.

问题是,我找不到如何设置中间件的示例.我见过重写我想要的方法的类,process_view:

Class CheckConditionMiddleware(object):  
    def process_view(self, request):  

        return None  

但是我该把这门课放在哪里呢?我是否要创建一个中间件应用程序,并将这个类放在其中,然后在settings.middleware中引用它?

推荐答案

First: The path structure

如果没有,则需要按照以下 struct 在应用程序中创建middleware文件夹:

yourproject/yourapp/middleware

The folder middleware should be placed in the same folder as settings.py, urls, templates...

Important: Don't forget to create the init.py empty file inside the middleware folder so your app recognizes this folder

Second: Create the middleware

现在我们应该为我们的定制中间件创建一个文件,在本例中,假设我们想要一个基于IP过滤用户的中间件,我们在middleware文件夹中创建一个名为filter_ip_middleware.py的文件,代码如下:

class FilterIPMiddleware(object):
    # Check if client IP is allowed
    def process_request(self, request):
        allowed_ips = ['192.168.1.1', '123.123.123.123', etc...] # Authorized ip's
        ip = request.META.get('REMOTE_ADDR') # Get client IP
        if ip not in allowed_ips:
            raise Http403 # If user is not allowed raise Error
 
       # If IP is allowed we don't do anything
       return None

Third: Add the middleware in our 'settings.py'

我们需要寻找:

  • MIDDLEWARE_CLASSES (django < 1.10)
  • MIDDLEWARE (django >= 1.10)

在设置中.我们需要添加我们的中间件(Add it in the last position).它应该是这样的:

MIDDLEWARE = ( #  Before Django 1.10 the setting name was 'MIDDLEWARE_CLASSES'
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
     # Above are django standard middlewares

     # Now we add here our custom middleware
     'yourapp.middleware.filter_ip_middleware.FilterIPMiddleware'
)

Done!现在,来自每个客户端的每个请求都将调用您的自定义中间件并处理您的自定义代码!

Django相关问答推荐

DjangoRestFramework 解析错误:"多部分表单解析错误多部分中的无效边界:None"

Django 如何知道我的数据库的路径?

Django `UniqueConstraint` 异常处理方式与 'unique=True' 相同

Django中的多对多关系?

Django:使用 Django ORM 实现 JOIN?

获取 Django 中的缓存键列表

如何迭代模板中 SelectField 的选项?

django npm 和 node 包架构

django excel xlwt

如何使用 SQL 的IN等字段上的数组过滤 django 查询集?

django.core.exceptions.ImproperlyConfigured:请求设置 USE_I18N,但未配置设置

测试 Django 信号的正确方法

带有消息判断的 Django/Python assertRaises

django post_save 更新信号

从表单获取模型实例而不保存

有日期时间±无穷大吗?

Django - 每 x 秒运行一个函数

get_or_create() 是否必须立即保存?

django sql 查询如何使用不区分大小写的同时包含?

AWS Cognito 作为网站的 Django 身份验证后端