使用 Django 处理类似许可证的系统

Handling a license-like system with Django

我正在尝试想出一种方法来处理 Django 中宠物项目的许可证。假设我希望客户必须为许可证付费,这样他们就可以在许可证到期之前访问该网站。

Django 中是否有内置工具来处理此类问题?

现在我能想到的就是创建一个新的 "license" 模型,使用我的客户模型的外键和日期时间字段,然后扩展客户模型以检查许可证是否仍然有效:

class License(models.Model): 
    customer = models.ForeignKey(
    license_end = models.DateTimeField(default=timezone.now)

然后我会用这个方法扩展客户模型:

def has_license(self, license):
    try:
        license = self.license.get(license=license)
    except Exception:
        return False

    return license.license_end > timezone.now()

而且我想在每个受许可证限制的视图上,我必须检查 if customer.has_license(license):(传递他们的有效许可证对象)。

虽然看起来我会在每个需要保护的视图上一遍又一遍地写同样的几行。

是否有更简单的设置方法(或类似方法)?

虽然有点相关,但我还必须想出一个许可证密钥的解决方案并对其进行身份验证,这是一个全新的问题,因此我不会将其包含在这个问题中。

你可以使用中间件

  1. 创建middleware.py及以下代码

    class LicenceMiddleware:
    
     def __init__(self, get_response):
            self.get_response = get_response
            # One-time configuration and initialization.
    
    
    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.
    
        response = self.get_response(request)
    
    
        if check_date:
            return response
        else:
            return render(request, 'licence_expired.html')
    
  2. 将您的中间件添加到 settings.py 中间件部分

现在,对于每个 request/response,它都会检查许可证中间件和 returns 响应。

您可以在模型中再创建一个字段来跟踪日期。