簡體   English   中英

如何將函數中的變量傳遞給裝飾器

[英]How do i pass a variable in a function to a decorator

我有一個函數,在其中定義了一個稱為動物的變量。 我也為該函數提供了一個裝飾器,但是它需要在原始函數中定義的變量。

我需要原始函數中的動物變量,或者我需要以某種方式將裝飾器中的model_data變量傳遞到原始函數中。 有輸入嗎?

這是代碼:

@csrf_exempt
@require_http_methods(["GET", "PUT", "DELETE"])
@parse_model_data
def base_animal(request, model_id):

    try:
        animal = Animal.objects.get(pk=model_id)
    except ObjectDoesNotExist:
        return json_error(error="No animal found for id: %s" % model_id)

    if request.method == "GET":
        return json_success(model=animal)

    if request.method == "DELETE":
        animal.delete()
        return json_success("Animal deleted.")

    if request.method == "PUT":
       animal.save()
       return json_success()

這是裝飾器函數:

def parse_model_data(originalFunction):
  def parse(*args, **kwargs):
        request = args[0]
        model_data = request.get_json_body()
        if not model_data:
          return json_error("no json body detected")
        model_data = Animal.parse_model_data(model_data)
        for attr, value in model_data.items():
            setattr(animal, attr, value)
        return originalFunction(*args, **kwargs)

return parse

裝飾器並非為此目的。 它無法訪問在函數內部創建的對象,因為調用修飾函數parse時該對象尚不存在。

似乎您在這里需要的是一個簡單的函數。

def parse(animal, request):
    model_data = request.get_json_body()
    if not model_data:
      return json_error("no json body detected")
    model_data = Animal.parse_model_data(model_data)
    for attr, value in model_data.items():
        setattr(animal, attr, value)

@csrf_exempt
@require_http_methods(["GET", "PUT", "DELETE"])
def base_animal(request, model_id):
    try:
        animal = Animal.objects.get(pk=model_id)
    except ObjectDoesNotExist:
        return json_error(error="No animal found for id: %s" % model_id)

    # Here we use our parse function
    # It cannot be called before that point since animal did not exist
    parse(animal, request)

    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM