首页 > 其他分享 >Django实现文件上传、文件列表查看、修改、限流和日志记录7

Django实现文件上传、文件列表查看、修改、限流和日志记录7

时间:2023-08-13 17:44:29浏览次数:109  
标签:文件 次数 cache request Django 访问 限流 file

Django实现文件上传、文件列表查看、修改、限流和日志记录7

不管调用的接口在内网,还是外网都需要做好限制保证接口的访问和限流降级处理,本章节新增限流功能。

限流功能主要针对两个方面: IP和用户

针对IP限流

文件列表接口进行限流处理,限制每分钟每个 IP 访问 10 次,你可以使用 Django 的内置限流功能结合缓存来实现

使用了 Django 的缓存系统来存储每个 IP 地址的访问次数。对于每个请求,我们首先获取客户端的 IP 地址,然后检查该 IP 地址的访问次数。如果访问次数超过限制(10 次),我们返回 403 Forbidden 响应。否则,我们增加访问次数并将缓存时间设置为 1 分钟。

from django.core.cache import cache
from django.http import HttpResponseForbidden

def file_list(request):
    # 获取客户端 IP 地址
    client_ip = request.META.get('REMOTE_ADDR')

    # 检查该 IP 地址的访问次数
    cache_key = f'file_list:{client_ip}'
    access_count = cache.get(cache_key, 0)

    # 如果访问次数超过限制,返回 403 Forbidden
    if access_count >= 10:
        logging.warning('用户 {} 在 {} 访问用户列表超过限制'.format(request.user.username, datetime.now()))
        return HttpResponseForbidden('访问次数超过限制')

    # 增加访问次数并设置缓存时间为 1 分钟
    cache.set(cache_key, access_count + 1, 60)

    # 继续处理文件列表逻辑
    # ...

    return render(request, 'file_list.html', {'file_list': file_list})

 

访问十次提示次数超限

 

针对用户限流

限制每个用户每分钟访问文件列表的次数,你可以使用 Django 的内置限流功能结合缓存来实现。

以下是一个示例代码,演示如何对每个用户进行限流处理,限制每分钟访问文件列表的次数为 10 次:

from django.core.cache import cache
from django.http import HttpResponseForbidden

def file_list(request):
    # 获取当前用户
    user = request.user

    # 检查该用户的访问次数
    cache_key = f'file_list:{user.username}'
    access_count = cache.get(cache_key, 0)

    # 如果访问次数超过限制,返回 403 Forbidden
    if access_count >= 10:
        logging.warning('用户 {} 在 {} 访问用户列表超过限制'.format(request.user.username, datetime.now()))
        return HttpResponseForbidden('访问次数超过限制')

    # 增加访问次数并设置缓存时间为 1 分钟
    cache.set(cache_key, access_count + 1, 60)

    # 继续处理文件列表逻辑
    # ...

    return render(request, 'file_list.html', {'file_list': file_list})

 

访问十次依然提示次数超限

装饰器限流

将限流定义为一个函数,并在其他接口中引用并设置不同的访问次数限制,你可以将限流逻辑封装在一个装饰器函数中,并在需要进行限流的视图函数上应用该装饰器。

#定义限流装饰器
from django.core.cache import cache
from django.http import HttpResponseForbidden

def rate_limit(limit_count):
    def decorator(view_func):
        def wrapper(request, *args, **kwargs):
            # 获取当前用户
            user = request.user

            # 检查该用户的访问次数
            cache_key = f'rate_limit:{user.username}'
            access_count = cache.get(cache_key, 0)

            # 如果访问次数超过限制,返回 403 Forbidden
            if access_count >= limit_count:
                logging.error('用户 {} 在 {} 查看上传文件列表失败'.format(request.user.username, datetime.now()))
                return HttpResponseForbidden('访问次数超过限制')

            # 增加访问次数并设置缓存时间为 1 分钟
            cache.set(cache_key, access_count + 1, 60)

            # 继续执行视图函数
            return view_func(request, *args, **kwargs)

        return wrapper

    return decorator

定义了一个名为 rate_limit 的限流函数,它接受一个访问次数限制作为参数。该函数返回一个装饰器函数,用于包装需要进行限流的视图函数。

要在其他接口上应用限流,你可以使用 @rate_limit(limit_count) 这样的语法,将装饰器应用到视图函数上。

###   调用示例一
#导入装饰器的限流函数
from .views import rate_limit

@rate_limit(10) #设置访问次数限制为10
@login_required
def file_list(request):

###   调用示例二
#导入装饰器的限流函数,若找不到rate_limit模块检查导入文件路径,将限流装饰器放在调用视图前面
from .views import rate_limit

@rate_limit(10) #设置访问次数限制为10
@login_required
def view_file(request, file_name):

访问上述两个路由地址超过十次报错,超过次数限制

 

django-ratelimit库进行限流

RatelimitMiddleware是django-ratelimit库提供的中间件,用于在请求到达视图之前进行请求限流,本次不做使用演示可自行了解使用,以下是一个演示示例:
#在Django的settings.py配置文件中添加以下配置:
# settings.py

INSTALLED_APPS = [
  # ...
  'ratelimit',
  # ...
]

MIDDLEWARE = [
  # ...
  'ratelimit.middleware.RatelimitMiddleware',
  # ...
]

# 在应用限流的视图函数或者类上使用ratelimit装饰器来进行限流设置
# myapp/views.py

from ratelimit.decorators import ratelimit

@ratelimit(key='ip', rate='5/m')  # 设置每分钟每个用户最多5个请求
def my_view(request):
  if request.limited:
        # 请求被限流的处理逻辑
        return HttpResponse('请求过于频繁,请稍后再试', status=429)

  # 处理请求的代码
  pass

 

至此,接口限流器的配置已经完成。

 

标签:文件,次数,cache,request,Django,访问,限流,file
From: https://www.cnblogs.com/weiweirui/p/17626877.html

相关文章

  • Django实现文件上传、文件列表查看、修改、限流和日志记录6
    Django实现文件上传、文件列表查看、修改、限流和日志记录6对于已经上传的文件,现在已经实现了文件的查看修改,美中不足的是:需要查看每个文件需要提前记住文件名指定文件名进行查看和修改。为此,新增一个上传文件的列表功能,在通过模版按钮跳转路由到查看和修改页面。实现逻辑查看......
  • Python文件路径解谜:深入剖析os.path系列函数的精髓
    介绍在Python中,os.path模块提供了一系列用于处理文件路径和文件系统的函数。它是Python标准库中os模块的一部分。本文将深入探讨os.path系列函数的使用方法,从入门到精通。目录导入os.path模块获取文件路径信息os.path.abspath():获取绝对路径os.path.dirname():获取目录......
  • Django实现文件上传、文件列表查看、修改、限流和日志记录4
    Django实现文件上传、文件列表查看、修改、限流和日志记录4本章添加用户认证功能,属于安全模块。用户认证在Django中,默认情况下,用户的用户名和密码是存储在数据库中的。Django提供了内置的用户模型(User模型),它可以管理用户的认证和授权。配置数据库在file_upload/settings.py......
  • Web通用漏洞--文件上传
    Web通用漏洞--文件上传概述文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题,对于如何确保这类安全问题,一般会从原生态功能中的文件内容,文件后缀,文件类型等方面判断,但是漏洞可能不仅在本身的代码验证逻辑中出现安全问题,也会在语言版本,语言函数......
  • Web通用漏洞--文件包含
    Web通用漏洞--文件包含文件包含原理在项目开发过程中,开发人员通常会将重复使用的函数写入单个文件中,在使用该类函数时,直接调用文件即可,无需重新编写,这种调用文件的过程成为文件包含。在文件包含过程中,如果用户可以控制所包含的文件,则为文件包含漏洞。文件包含函数PHP:include、......
  • ctfshow--web入门--文件上传
    ctfshow--web入门--文件上传web151(前端校验)题目中提示前端检验不可靠,应该对前端检验进行绕过检查前端代码进行修改,使php文件可以通过前端校验,成功上传后进行命令执行,找到flagweb152(content-type)通过前端校验后上传php文件显示文件类型不合规尝试抓包修改content-type......
  • Django实现文件上传、文件列表查看、修改、限流和日志记录2
    Django实现文件上传、文件列表查看、修改、限流和日志记录2本章节优化新增功能使用ssh秘钥连接远程服务器进行文件上传使用ssh私钥连接远程服务器上传文件使用SSH私钥连接远程服务器并上传文件,你可以使用paramiko库来实现SSH连接和文件传输的功能。首先,确保你已经生成了SSH......
  • Django实现文件上传、文件列表查看、修改、限流和日志记录1
    Django实现文件上传、文件列表查看、修改、限流和日志记录1上一章已经实现了文件的上传到项目的指定目录中,这章我们继续乘胜追击继续优化实现。一般都是上传文件到后端服务器上,因此需要建立一个远程服务器的连接,本章连接远程服务器实现文件上传实现点击上传本地文件到远程服务......
  • pyspark写入文件
    ##py_spark_rdd2py.py#py_learn##CreatedbyZ.Steveon2023/8/1311:39.##1.rdd.collect()将rdd变为list#2.rdd.reduce()不分组,对rdd数据做两两聚合frompysparkimportSparkConf,SparkContextconf=SparkConf().setMaster("local[*]")......
  • 文件属性
    简介linux是多用户系统,不同用户处于不同地位修改文件/目录所属用户与权限 chown(changeowner):修改所属用户与组。chmod(changemode):修改用户的权限。查看文件/目录所属用户和组ll或者ls-l 第一个字母:当为d则是目录当为-则是文件;若是l则表示为链......