Python 3.x 如何在执行任何API之前检查条件-python

Python 3.x 如何在执行任何API之前检查条件-python,python-3.x,django,django-rest-framework,python-decorators,Python 3.x,Django,Django Rest Framework,Python Decorators,我的项目有很多API。但是现在,我必须在开始执行其中的代码之前检查所有这些API。我必须确保只有当特定表单的停用日期大于datetime.date.today()时,API才会返回数据。Queryset将是- available\u for\u entry=Forms.objects.filter(form\u id=form\u id,deactivate\u date\u gte=today\u date)。exists() 一种方法是在每个API中编写查询集,然后使用如果可用的话\u作为输

我的项目有很多API。但是现在,我必须在开始执行其中的代码之前检查所有这些API。我必须确保只有当特定表单的停用日期大于
datetime.date.today()
时,API才会返回数据。Queryset将是-

available\u for\u entry=Forms.objects.filter(form\u id=form\u id,deactivate\u date\u gte=today\u date)。exists()

一种方法是在每个API中编写查询集,然后使用
如果可用的话\u作为输入:
条件。但是,我想知道是否有其他方法可以在不多次编写类似条件的情况下实现这一点

我试图通过编写decorator来实现这一点,但我无法将
表单id
值从基于函数的API传递给该decorator。代码的快照是

def is_form_available(func):
    def checking():
        today_date = datetime.date.today()
        available_for_entry = Forms.objects.filter(form_id=form_id, deactivate_date__gte=today_date).exists()
        if available_for_entry:
            func()
        else:
            print('form is not available now')
    return checking
    

@api_view(['POST'])
@is_form_available
def question_list(request):
  form_id = request.POST.get('form_id')
  parameter_list = (FormParameters.objects.filter(mappings__form__formparametermappings=   form_id).all())
  serializer = FormParametersQuizSerializer(parameter_list, many=True)

  return serializer.data

Decorator是个好主意,你可以从Django本地的Decorator那里得到一些灵感,比如

从functools导入包装
def格式可用(func):
@包装(func)
def检查(请求、*args、**kwargs):
表格编号=
today\u date=datetime.date.today()
可用的\u条目=Forms.objects.filter(form\u id=form\u id,deactivate\u date\u gte=today\u date)。存在()
如果可用于输入的\u:
返回函数(args、kwargs)
其他:
打印('表格现在不可用')
退货检查

Decorator是个好主意,你可以从本地的Django Decorator那里得到一些灵感,比如

从functools导入包装
def格式可用(func):
@包装(func)
def检查(请求、*args、**kwargs):
表格编号=
today\u date=datetime.date.today()
可用的\u条目=Forms.objects.filter(form\u id=form\u id,deactivate\u date\u gte=today\u date)。存在()
如果可用于输入的\u:
返回函数(args、kwargs)
其他:
打印('表格现在不可用')
退货检查

是的,成功了!,但我想了解1
@wrapps(func)
即使没有那行代码,我也能得到想要的结果。你认为我还需要那条线吗?我需要在这行
return func(args,kwargs)
中做一个更改,它也需要。要传递
请求
,从另一方面来说,它会抛出一个错误。还有一个问题-如果我需要打一个复选框,比如,
表单id
是否已给出,该怎么办。我应该把这个条件写在哪里?在装饰器中还是在主函数中?很高兴我能帮上忙!这篇文章详细解释了wrapps的功能;TLDR允许您保留函数名,这对Django视图名非常有用,因为日志记录非常有用。对于第二个问题,我想这真的取决于检查的一般性,如果它适用于所有情况,那么decorator是一个好地方。你可以从装饰器开始,然后重构。是的,它成功了!,但我想了解1
@wrapps(func)
即使没有那行代码,我也能得到想要的结果。你认为我还需要那条线吗?我需要在这行
return func(args,kwargs)
中做一个更改,它也需要。要传递
请求
,从另一方面来说,它会抛出一个错误。还有一个问题-如果我需要打一个复选框,比如,
表单id
是否已给出,该怎么办。我应该把这个条件写在哪里?在装饰器中还是在主函数中?很高兴我能帮上忙!这篇文章详细解释了wrapps的功能;TLDR允许您保留函数名,这对Django视图名非常有用,因为日志记录非常有用。对于第二个问题,我想这真的取决于检查的一般性,如果它适用于所有情况,那么decorator是一个好地方。您可以在decorator中开始使用它,稍后再进行重构。
from functools import wraps

def is_form_available(func):
    @wraps(func)
    def checking(request, *args, **kwargs):
        form_id = <extract from request>
        today_date = datetime.date.today()
        available_for_entry = Forms.objects.filter(form_id=form_id, deactivate_date__gte=today_date).exists()
        if available_for_entry:
            return func(args, kwargs)
        else:
            print('form is not available now')
    return checking