【问题标题】:Handling a license-like system with Django使用 Django 处理类似许可证的系统
【发布时间】:2018-12-14 01:03:32
【问题描述】:

我正在尝试想出一种方法来处理 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):(传递他们的有效许可证对象)。

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

有没有更简单的方法来设置它(或类似的东西)?

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

【问题讨论】:

  • 你好 Mormoran,你用你的产品做过这个吗?
  • 我已经针对我的问题实施了类似的解决方案。我在许可模型上使用了相同的代码,并使用 has_licence() 方法对其进行了扩展。然后在计划任务中,我每 24 小时在午夜检查客户的许可证是否仍然有效。如果结果为假,那么我删除他们的会话并将所有人注销(客户有多个用户)。然后我在登录时再次检查他们的许可证(扩展了用户模型)。如果他们的许可证已过期,我拒绝登录并重定向到他们可以上传新许可证文件的许可证页面
  • 如果我们在企业级部署产品,这意味着我们在他的机器上部署了源代码。如果有人知道 python,那么他可以根据我的理解轻松删除 has_licence() 检查。您是否使用任何隐藏的密钥来解密许可证密钥?
  • 好吧,在我的情况下,客户无法访问源代码,所以我不必担心他们修改模型中的方法。

标签: python django django-views licensing


【解决方案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 中间件部分

现在对于每个请求/响应,它都会检查 licencemiddleware 并返回响应。

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

【讨论】:

  • 这是一个非常好的建议。我在网站的其他部分使用了自定义中间件,虽然我已经实现了不同的解决方案,但这个解决方案非常干净简洁。我会接受它作为答案,感谢您也花时间解释代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
相关资源
最近更新 更多