如何在执行任何 api 之前检查条件 - python

how to check a condition before exectuing any apis - python

我的项目有很多 API。但现在我必须在开始执行其中的代码之前检查所有这些 APIs。如果特定表单的停用日期晚于 datetime.date.today(),我必须确保 API 只有 returns 数据。查询集将是 -

available_for_entry = Forms.objects.filter(form_id=form_id, deactivate_date__gte=today_date).exists()

一种方法是在每个 API 中编写查询集,然后使用 if available_for_entry: 条件。但是,我想知道是否有任何其他方法可以在不多次编写类似条件的情况下实现这一目标。

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

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

装饰器是个好主意,你可以从原生的 Django 装饰器中得到一些灵感,比如 require_http_methods

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