django - 处理 Django 用户订阅到期日期
问题描述
我有一个扩展 AbstractBaseUser 的用户模型
class User(AbstractBaseUser):
email = models.EmailField(max_length=255, unique=True, default='abc123@gmail.com')
forename = models.CharField(max_length=20, default='')
surname = models.CharField(max_length=20, default='')
account_expiry = models.DateField(default=datetime.now() + timedelta(days=365))
在我的所有观点中,我使用 LoginRequiredMixin 进行身份验证,例如
class IndexView(LoginRequiredMixin, generic.TemplateView):
我不仅想通过电子邮件和密码对用户进行身份验证,还想通过检查帐户到期日期是否尚未达到。
我的问题是 - 实现这一目标的最佳(最简单?)方法是什么。我是否按照此处所述编写自己的自定义身份验证后端?还是我应该写一个自定义的 Mixin 或中间件?
解决方案
所以最后我的解决方案是创建我自己的自定义中间件。
我发现如何创建自定义 Django 中间件是一个有用的起点,但它对我不起作用,因为我使用的是 Django 2.0.1。官方文档解释了如何更新解决方案,我也发现这篇 SO帖子很有用。
所以我的代码看起来像:
class AccountExpiry:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
current_user = request.user
response = self.get_response(request)
expiry_path = reverse('accounts:account-expired')
if current_user.is_anonymous is False:
if current_user.admin is False and current_user.staff is False:
if request.path not in [expiry_path]:
expiry_date = current_user.school.account_expiry
todays_date = datetime.today().date()
if todays_date > expiry_date:
return HttpResponseRedirect(expiry_path)
return response
(请注意,根据我上面的原始问题,account_expiry 实际上是相关表(学校)中的字段,而不是用户模型中的字段)。
我更新了设置 MIDDLEWARE= 以包括
'common.middleware.AccountExpiry',
它可以按我的意愿工作。
推荐阅读
- python-3.x - 如何从 vtp xml 文件中读取数据
- python - 如何在 Datalake gen 1 中创建一个文件夹,同时将 pandas 数据框保存为 csv?
- python - scipy.linalg.solve 的矢量化
- python - 如何向 difflib 添加条件?
- postgresql - 具有 PostgreSQL 引擎连接限制的 RDS 数据库
- android - 如何在 android 中制作 IconButton?
- node.js - 未捕获的 ReferenceError:io 未在索引 40 处定义
- javascript - 通过父类在焦点输入和焦点输出事件上选择子输入文本框
- regex - 正则表达式
- apache-spark - 在 Spark 中阅读 Kafka 主题尾部