Упрощенная структура модели (я пропускаю важные моменты, очевидно, есть веские причины, по которым они есть в разных моделях):
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":[]}
Мы отключили все виды кэширования, мы не обращаемся ни к какому виду прокси-службы, но мы неоднократно, но не всегда, не получаем результатов для «правильных» запросов, когда всеЮнитестесты и ручные запросы оболочки возвращают правильный результат.
Есть предложения, где искать?Какая другая обработка данных не происходит при запросе через фабрику тестовых запросов?