繁体   English   中英

检查帐户在Django中是否有效

[英]Checking if an account is valid in Django

我正在尝试为我的视图创建一些验证逻辑。 为了不重复我自己,我想将验证逻辑包含在一个函数中,然后可以由其他视图函数调用该逻辑。 验证功能称为check_if_account_valid 但是,看起来好像没有调用嵌入在验证功能中的HttpResponseRedirectsubscription_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 HttpResponseRedirectcheck_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_requireduser_passes_test 然后,您的视图将简化为:

@check_if_account_valid
def home(request):

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM