0

简化的模型结构(我忽略了重要的部分,显然,这些在不同的模型中有很好的理由):

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 请求都返回正确的结果时,我们反复但并非始终如一地得到“正确”请求的结果。

关于在哪里看的任何建议?通过测试请求工厂请求时不会发生其他哪些数据处理?

4

2 回答 2

0

测试请求工厂中似乎缺少用户身份验证,因此它在没有任何过滤器的情况下获取。self.request.user中的用户对象设置了什么值

或者它可能是没有正确设置参考值。

于 2018-05-17T10:39:13.587 回答
0

原来问题出在序列化程序中,它指定了一个策略类。不知道为什么对序列化程序制定策略有时会不返回任何结果,而有时会返回正确的结果,但是在花了四天时间之后,我不在乎,我很高兴它可以工作。

于 2018-05-17T13:28:06.913 回答