[英]Checking if an account is valid in Django
我正在尝试为我的视图创建一些验证逻辑。 为了不重复我自己,我想将验证逻辑包含在一个函数中,然后可以由其他视图函数调用该逻辑。 验证功能称为check_if_account_valid
。 但是,看起来好像没有调用嵌入在验证功能中的HttpResponseRedirect
, subscription_status
检查有效(已打印“ Subscription status is lapsed”),但不会发生重定向。
调用每个视图时,如何有一个视图执行一些验证逻辑? 您无法从另一个视图中调用视图是有原因的吗? 有更好的方法吗?
models.py
class Account(models.Model):
SUBSCRIPTION_CHOICES = (
('Dev Account', 'Dev Account for Testing'),
('15 day trial', '15 day trial'),
('Paid', 'Paid account - payment up to date'),
('Lapsed', 'Paid account - payment lapsed'),
('Inactive', 'Inactive'),
)
user = models.OneToOneField(User, on_delete=models.CASCADE)
subscription_status = models.CharField(choices=SUBSCRIPTION_CHOICES, default='15 day trial',
max_length=100)
date_created = models.DateTimeField(auto_now_add=True)
views.py
def check_if_account_valid(request):
if request.user.is_authenticated():
subscription_status = request.user.account.subscription_status
date_created = request.user.account.date_created
if subscription_status == '15 day trial':
localtz = pytz.timezone('Europe/Lisbon')
now_datetime = datetime.datetime.utcnow()
now_datetime_loc = localtz.localize(now_datetime)
# check if trial is up
if (date_created - now_datetime_loc) < datetime.timedelta(days=15):
pass
# if it is up, do nothing
else:
return HttpResponseRedirect('/subscription/trial_ended/')
elif subscription_status == 'Paid':
pass
elif subscription_status == 'Lapsed':
print('Subscription status is lapsed')
return HttpResponseRedirect('/subscription/lapsed/')
elif subscription_status == 'Inactive':
return HttpResponseRedirect('/subscription/inactive/')
else:
return HttpResponseRedirect('/login/')
def home(request):
check_if_account_valid(request)
context = {}
return render(request, 'home.html', context)
Django的== 1.8.4
这是因为您check_if_account_valid
HttpResponseRedirect
从check_if_account_valid
返回到home
但随后check_if_account_valid
它们不执行任何操作。
问题是您不返回您的回复。 为了使您的工作方法可行,您可能需要将其更改为:
def check_if_account_valid(request, next_view):
if request.user.is_authenticated():
subscription_status = request.user.account.subscription_status
date_created = request.user.account.date_created
if subscription_status == '15 day trial':
localtz = pytz.timezone('Europe/Lisbon')
now_datetime = datetime.datetime.utcnow()
now_datetime_loc = localtz.localize(now_datetime)
# check if trial is up
if (date_created - now_datetime_loc) < datetime.timedelta(days=15):
pass
# if it is up, do nothing
else:
return HttpResponseRedirect('/subscription/trial_ended/')
elif subscription_status == 'Paid':
pass
elif subscription_status == 'Lapsed':
print('Subscription status is lapsed')
return HttpResponseRedirect('/subscription/lapsed/')
elif subscription_status == 'Inactive':
return HttpResponseRedirect('/subscription/inactive/')
else:
return HttpResponseRedirect('/login/')
return next_view
然后像这样调用您的视图:
def home(request):
context = {}
next_view = render(request, 'home.html', context)
return check_if_account_valid(request, next_view)
一个更好的(更Django的等)的方法可能是切换到ClassBased查看 ,创建一个的Mixin其中check_if_account_valid
被称为在调度 methdod。
您的check_if_account_valid
函数返回HTTPResponse
但是您的home
视图不对其执行任何操作。
为了使代码正常工作,您必须返回响应
def home(request):
return check_if_account_valid(request)
context = {}
return render(request, 'home.html', context)
但这总是会返回的,对于有效的帐户,您是不希望的。 因此,您需要添加如下检查:
def home(request):
response = check_if_account_valid(request)
if response is not None:
return response
context = {}
return render(request, 'home.html', context)
这行得通,但不是很整洁。 更好的方法是将check_if_account
用作装饰器。 Django将这种方法用于装饰器,例如login_required
和user_passes_test
。 然后,您的视图将简化为:
@check_if_account_valid
def home(request):
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.