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

时间:2018-07-05 13:53:57

标签: python django django-views licensing

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

在Django中是否有内置工具可以处理类似的事情?

现在我所能想到的就是创建一个新的“许可证”模型,该模型具有指向我的客户模型的外键和日期时间字段,然后扩展客户模型以检查许可证是否仍然有效:

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 个答案:

答案 0 :(得分:1)

您可以使用中间件

  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中间件部分

现在,对于每个请求/响应,它都会检查许可证中间件并返回响应。

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