【问题标题】:how to check a condition before exectuing any apis - python如何在执行任何 api 之前检查条件 - python
【发布时间】:2021-06-06 15:57:15
【问题描述】:

我的项目有很多 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: 条件。但是,我想知道是否有任何其他方法可以在不多次编写类似条件的情况下实现这一目标。

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

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

【问题讨论】:

    标签: python-3.x django django-rest-framework python-decorators


    【解决方案1】:

    装饰器是个好主意,你可以从像require_http_methods这样的原生Django装饰器中获得一些灵感

    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
    

    【讨论】:

    • 是的,它起作用了!但我想了解 1。@wraps(func) 即使没有那条线,我也会得到想要的结果。你认为我还需要那条线吗?我需要在return func(args, kwargs)这一行中进行更改,它还需要在其中传递request,否则会引发错误。
    • 还有一个问题 - 如果我需要进行检查,例如 form_id 是否已给出,该怎么办。我应该在哪里写这个条件 - 在装饰器或主函数中?
    • 很高兴能帮上忙!这篇文章详细解释了包装 stackoverflow.com/questions/308999/what-does-functools-wraps-do 的作用; TLDR 它允许您保留函数名称,这在日志记录有很大帮助的 Django 视图名称中尤其有用。对于第二个问题,我想这真的取决于检查的普遍性,如果它适用于所有情况,那么装饰器是一个好地方。您可以在装饰器中开始使用它,然后再进行重构。
    猜你喜欢
    • 2021-04-21
    • 2013-03-28
    • 1970-01-01
    • 2021-03-09
    • 2019-12-27
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    相关资源
    最近更新 更多