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



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

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

Decorator是一个好主意,你可以从本地Django Decorator(如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

最新更新