qq_26083679 2024-02-27 22:05 采纳率: 69.2%
浏览 4
已结题

django框架下,对api有访问的截止时间

为接口服务提供一个截止日期,每次请求前进行日期校验,最好不要在程序里明码显示截止日期,有没有实现思路呢?

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-27 22:07
    关注

    引自免费微信小程序:皆我百晓生

    在Django框架下,你可以通过配置设置或数据库存储的方式来实现API访问截止日期的校验。这里提供一种基于环境变量和中间件实现的方法:

    首先,在项目的settings.py文件中添加一个环境变量,用于存储API的截止日期(YYYY-MM-DD格式):

    import os
    
    API_EXPIRATION_DATE = os.environ.get('API_EXPIRATION_DATE', '2023-12-31')  # 默认截止日期为2023年12月31日
    

    然后创建一个自定义中间件,用于在每次请求处理前进行日期校验:

    # 在middleware目录下新建文件:api_expiration_date_checker.py
    
    from datetime import datetime
    from django.utils.deprecation import MiddlewareMixin
    from django.core.exceptions import PermissionDenied
    
    class APIExpirationDateMiddleware(MiddlewareMixin):
        def process_request(self, request):
            expiration_date = datetime.strptime(settings.API_EXPIRATION_DATE, '%Y-%m-%d')
            current_date = datetime.now()
    
            if current_date > expiration_date:
                raise PermissionDenied('API access has expired.')
    
            return None
    

    最后,在项目的settings.py文件中注册这个中间件:

    MIDDLEWARE = [
        # ...
        'your_project.middleware.api_expiration_date_checker.APIExpirationDateMiddleware',
        # ...
    ]
    

    这样,当客户端尝试访问任何接口时,系统都会自动检查当前日期是否超过设定的截止日期,如果已过期,则返回403 Forbidden错误。

    注意

    • 请确保已在部署环境中正确设置了环境变量API_EXPIRATION_DATE
    • 上述代码未包含对时间区别的处理,如果需要考虑时区因素,请使用datetime.now(timezone.utc)获取UTC时间。

    通过这种方式,你无需在源代码中明文显示截止日期,而是将其作为一个可配置项,增强了灵活性与安全性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月16日
  • 已采纳回答 3月8日
  • 创建了问题 2月27日

悬赏问题

  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画