Django Viewset возвращает разные данные между оболочкой / тестами и фактическими запросами - PullRequest
0 голосов
/ 17 мая 2018

Упрощенная структура модели (я пропускаю важные моменты, очевидно, есть веские причины, по которым они есть в разных моделях):

class Contact(models.Model):
    receive_marketing = models.DateTimeField(null=True, blank=True)

class User(models.Model):
    email_hash = models.CharField(max_length=255)
    contact = models.ForeignKey(Contact)

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

представление выглядит следующим образом:

class ContactViewSet(viewsets.ModelViewSet):
    queryset = Contact.objects.all()
    permission_classes = (AllowAny, )

    def get_queryset(self):
        if self.request.user.is_staff:
            return ContactViewSet.queryset

        token = self.request.query_params.get('ref')
        return Contact.objects.filter(user__email_hash__isnull=False,
                                      user__email_hash=token).distinct()

Таким образом, сотрудники могут видеть и получать доступ ко всем Contact записям, но в противном случае мы вернем набор запросов с одной записью, Contact, связанной с User сemail_hash, который соответствует параметру запроса ref.

Он проходит все юнит-тесты, проверяя различные комбинации сотрудников, а не, с параметром запроса ref и без него и т. д.

Если я вхожу в нашу удаленную среду и запускаю оболочку django, я могу сделать следующее:

>>> from user.views import ContactViewSet
>>> from rest_framework.test import APIRequestFactory
>>> factory = APIRequestFactory()
>>> view = ContactViewSet.as_view({'get': 'list'})
>>> request = factory.get('/contact/?ref=a-valid-hash')
>>> view(request).rendered_content
b'{"count":1,"next":null,"previous":null,"results":[{"id":222,"receive_marketing":"2018-05-15T14:11:13.449719Z"}]}'

Однако, если вы затем сделаете тот же самый запрос из браузера или скручивания:

$ curl http://user-service-url/contact/?ref=a-valid-hash
{"count":0,"next":null,"previous":null,"results":[]}

Мы отключили все виды кэширования, мы не обращаемся ни к какому виду прокси-службы, но мы неоднократно, но не всегда, не получаем результатов для «правильных» запросов, когда всеЮнитестесты и ручные запросы оболочки возвращают правильный результат.

Есть предложения, где искать?Какая другая обработка данных не происходит при запросе через фабрику тестовых запросов?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Оказывается, проблема была в Сериализаторе, который указал класс Политики. Понятия не имею, почему наличие политики на сериализаторе иногда приводило к тому, что результаты не возвращались, а в других случаях возвращались правильные результаты, но, потратив четыре дня на это, мне все равно, я просто рад, что это работает.

0 голосов
/ 17 мая 2018

Аутентификация пользователя отсутствует в фабрике тестовых запросов, поэтому она выбирается без какого-либо фильтра. Какое значение установлено для пользовательского объекта в self.request.user

Или это может быть ref значение установлено неправильно.

...