简化的模型结构(我忽略了重要的部分,显然,这些在不同的模型中有很好的理由):
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
匹配的a。ref
这通过了所有单元测试检查人员的各种组合,而不是,有和没有ref
查询参数等。
如果我登录到我们的远程环境并启动一个 django shell,我可以执行以下操作:
>>> 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 发出完全相同的请求:
$ curl http://user-service-url/contact/?ref=a-valid-hash
{"count":0,"next":null,"previous":null,"results":[]}
我们已经禁用了所有类型的缓存,我们没有通过任何类型的代理服务,但是当所有单元测试和手动 shell 请求都返回正确的结果时,我们反复但并非始终如一地得到“正确”请求的结果。
关于在哪里看的任何建议?通过测试请求工厂请求时不会发生其他哪些数据处理?