TypeError при регистрации URL-адресов kwargs в представлении на основе классов в Django - PullRequest
1 голос
/ 25 апреля 2019

Я использую параметризованный URL в API, основанном на Django Rest Framework. Я не могу передать параметр url в представление на основе классов, указанное этим URL.

Я использую ** kwargs в определении функции представления для передачи переменной url, но получаю сообщение об ошибке при вызове url.

шаблон URL похож на ниже-

 url(r'product/(?P<id>\d+)/details/$', APIProductDetails.as_view())

вид выглядит как ниже-

class APIProductDetails(CustomAPI):

    permission_classes = (CustomAuthentication,)

    def get(self, request, **kwargs):
        id = kwargs.get('id',None)
        return Response(data={}, status=200)

    def post(self, request, **kwargs):
        return Response(data={}, status=200)

При тестировании URL с помощью pytest я получаю сообщение об ошибке ниже -

TypeError: 'id' является недопустимым аргументом ключевого слова для этой функции

мой код pytest похож на ниже-

response = client.get(
        "/api/v1/rm/product/1/details/"
    )

assert response.status_code == 200

Другие API, которые не содержат параметров, работают нормально. Чего мне не хватает?

edit: Предоставление более подробной информации в соответствии с комментариями Alasdair

Как указано в комментарии, запрос обрабатывался CustomAPI.

class CustomAPI(APIView):
    _url = None

    def initial(self, request, *args, **kwargs):
        logger.info("Request: %s, Args: %s, Kwargs: %s" % (request.__dict__, str(*args), str(**kwargs)))
        CustomAPI._url = request.get_full_path()
        super(CustomAPI, self).initial(request, *args, **kwargs)

Ошибка в строке

Файл "путь / к / app / api_common.py", строка 55, в начальной logger.info («Запрос:% s, Аргументы:% s, Kwargs:% s»% (запрос. dict , str (* args), str (** kwargs))) Ошибка типа: 'id' является недопустимым аргументом ключевого слова для этой функции

что-то не так с str (** kwargs)?

Ответы [ 3 ]

1 голос
/ 25 апреля 2019

В настоящее время у вас есть str(**kwargs).Если kwargs равно {'id': '5'}, это эквивалентно str(id=5), что поднимает TypeError, поскольку str не принимает id.

Если вы хотите строковое представление kwargs dict, затем используйте:

str(kwargs)

Аналогично, str(*args) выдаст ошибку TypeError, если len(args) > 1.Вы должны использовать:

str(args)
0 голосов
/ 25 апреля 2019

или вы можете передать идентификатор в методе

class APIProductDetails(CustomAPI):

    permission_classes = (CustomAuthentication,)

    def get(self, request, id):
        return Response(data={}, status=200)
0 голосов
/ 25 апреля 2019

Вы должны получить доступ к аргументам через self.kwargs, а не kwargs метода.

Django на самом деле не вызывает ваш метод в прямом подходе.Поскольку он создает экземпляр класса на лету, доступ к kwargs невозможен, как в представлении на основе функций.Представления DRF - это не что иное, как общее представление Django, поэтому правило применимо и к ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...