Как повторно использовать функцию или класс в Django - PullRequest
1 голос
/ 26 марта 2019

Это мой класс TimesheetListApiV2 Есть много таких классов.

@valid_accesstoken_check
class TimesheetListApiV2(APIView):

    def get(self, request):

        try:
            accesstoken=AccessToken.objects.get(
                        token=self.request.META.get('HTTP_AUTHORIZATION').replace('Bearer ', '')
                    )
        except ObjectDoesNotExist:
            return Response (
                {
                    "status" : False,
                    "error" : "Wrong Access Token",
                    "error_message":"You have provided wrong access token.",
                }
            )

Теперь во всех моих классах есть этот фрагмент кода.

try:
    accesstoken=AccessToken.objects.get(
                token=self.request.META.get('HTTP_AUTHORIZATION').replace('Bearer ', '')
            )
except ObjectDoesNotExist:
    return Response (
        {
            "status" : False,
            "error" : "Wrong Access Token",
            "error_message":"You have provided wrong access token.",
        }
    )

Я хочу написать функцию или класс, где использовать этот код вместо его написания.Но это должно быть работоспособно, даже если request должно быть пройдено.Даже в будущем я собираюсь добавить еще такой код, который должен быть использован повторно.

Я пытался сделать это decorators.py

from django.core.exceptions import ObjectDoesNotExist
from oauth2_provider.models import AccessToken

def valid_accesstoken_check(function):
    def wrap(request, *args, **kwargs):
        try:
            accesstoken=AccessToken.objects.get(
                        token=self.request.META.get('HTTP_AUTHORIZATION').replace('Bearer ', '')
                    )
        except ObjectDoesNotExist:
            return Response (
                {
                    "status" : False,
                    "error" : "Wrong Access Token",
                    "error_message":"You have provided wrong access token.",
                }
            )
    wrap.__doc__ = function.__doc__
    wrap.__name__ = function.__name__
    return wrap

Но это дает ошибку

path('timesheet/list', views.TimesheetListApiV2.as_view(), name='api_v2_timesheet_list'),
AttributeError: 'function' object has no attribute 'as_view'

1 Ответ

0 голосов
/ 26 марта 2019

Ваш декоратор должен применять метод get, а не сам класс:

class TimesheetListApiV2(APIView):
    @valid_accesstoken_check
    def get(self, request):
    ...
...