Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django在聊天应用程序中使用Rest框架身份验证消息过滤策略/问题进行过滤_Django_Django Models_Django Rest Framework_Django Filter_Ed - Fatal编程技术网

Django在聊天应用程序中使用Rest框架身份验证消息过滤策略/问题进行过滤

Django在聊天应用程序中使用Rest框架身份验证消息过滤策略/问题进行过滤,django,django-models,django-rest-framework,django-filter,ed,Django,Django Models,Django Rest Framework,Django Filter,Ed,我有一个Django DRF后端,实现了令牌用户身份验证。应用程序本身是一个聊天室,由公共大厅和特定用户之间的私有线程组成。目前,我的模型文件包括消息模型,它与大厅和线程模型具有外键关系,并将其中一个字段保持为Null,以确定特定消息是涉及私有线程还是涉及公共大厅 到目前为止,我一直专注于开发公共大厅,用户根据他当前所在的大厅查询消息 在我完成了大厅的开发并启用了身份验证后,前端停止了按大厅标题过滤消息,只是继续简单地返回与当前已验证用户相关的所有消息-显然忽略了消息相关的大厅之间的任何区分。在

我有一个Django DRF后端,实现了令牌用户身份验证。应用程序本身是一个聊天室,由公共大厅和特定用户之间的私有线程组成。目前,我的模型文件包括消息模型,它与大厅和线程模型具有外键关系,并将其中一个字段保持为Null,以确定特定消息是涉及私有线程还是涉及公共大厅

到目前为止,我一直专注于开发公共大厅,用户根据他当前所在的大厅查询消息

在我完成了大厅的开发并启用了身份验证后,前端停止了按大厅标题过滤消息,只是继续简单地返回与当前已验证用户相关的所有消息-显然忽略了消息相关的大厅之间的任何区分。在检查了实际的API之后,我发现当我启用身份验证时,过滤选项从页面中完全消失

how can I combat this issue? 
编辑:我用一些代码更新了帖子 我宁愿保留一个消息模型,也不愿为大厅和线程创建单独的消息模型

以下是我的模型:

class Thread(models.Model):
    user1 = models.ForeignKey(Account, on_delete=models.PROTECT, related_name="user1")
    user2 = models.ForeignKey(Account, on_delete=models.PROTECT, related_name="user2")
    date = models.DateTimeField(auto_now_add=True, blank=False) 
    def __repr__(self):
        return f"user1: {self.user1} user2: {self.user2}"

class Message(models.Model):
    content = models.TextField(max_length=255, default="", blank=False, null=False)

    user = models.ForeignKey(Account, on_delete=models.PROTECT, related_name="user")
    date = models.DateTimeField(auto_now_add=True, blank=False)

    lobby = models.ForeignKey(Lobby, on_delete=models.CASCADE, related_name="messages", blank=True, null=True )
    thread = models.ForeignKey(Thread, on_delete=models.CASCADE, related_name="messages", blank=True,
    null=True )

class Lobby(models.Model):
    title = models.TextField(max_length=90, blank=False, null=False)
    thumb = models.ImageField(default='lobby.jpg')
以下是序列化程序:

class ThreadSerializer(serializers.ModelSerializer):
    user1 = serializers.CharField(source="user1.username")
    user1thumb = serializers.CharField(source="user1.accountimage.image.url")
    user2 = serializers.CharField(source="user2.username")
    user2thumb = serializers.CharField(source="user2.accountimage.image.url")
    class Meta:
        model= Thread
        fields = ["user1", "user2", "user1thumb", "user2thumb"]


class MessageSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.username')
    thumb = serializers.CharField(source='user.accountimage.image.url')
    class Meta:
        model= Message
        fields=['id','content', 'username', 'thumb']

class LobbySerializer(serializers.ModelSerializer):
    class Meta:
        model=Lobby
        fields="__all__"
        depth=2
最后是意见:

class ThreadView(viewsets.ModelViewSet):
    queryset = Thread.objects.all()
    serializer_class = ThreadSerializer

    def get_queryset(self):
        print(self.request.user)
        return Thread.objects.filter(Q(user1= self.request.user) | Q(user2=self.request.user))


class MessageView(viewsets.ModelViewSet):
    queryset = Message.objects.all()
    serializer_class = MessageSerializer
    filter_fields=('lobby__title',)



class LobbyView(viewsets.ModelViewSet):
    queryset = Lobby.objects.all()
    serializer_class = LobbySerializer
在my settings.py中,我全局启用了身份验证:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES':[
        'rest_framework.authentication.TokenAuthentication', 
        'rest_framework.authentication.SessionAuthentication'
    ], 
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',

    )
}
更新: 你的问题与授权无关。您正在添加一个

REST\u框架

设置块,但未指定要使用的筛选器后端

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES':[
        'rest_framework.authentication.TokenAuthentication', 
        'rest_framework.authentication.SessionAuthentication'
    ], 
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend',]

}
替换

过滤器\字段='大厅\标题'

与:

附言:如果你还没有安装django过滤器,你需要pip安装


我希望这有帮助

你能用更多的代码和更少的文本重新问这个问题吗?@engin_ipek因为没有实际的代码,我把项目的代码包括进去了。如果问题的主题不清楚,请让我现在,这样我可以尝试格式更简短的文本这似乎不是这样的情况,有一些不同的事情正在进行。我完全按照你说的做了,所发生的一切就是我的数据中有另一个字段。这是一种奇怪的行为,因为当我在Stutux.Py中注释掉整个授权的事情时,一切看起来都很好,我的API中有过滤器图标,但是一旦我添加了身份验证,并作为用户登录,过滤器图标就消失了??我不明白这种行为,也许我应该考虑改写的观点谢谢!这就解决了问题!再次感谢!顺便问一下,你对这个私有线程与公共大厅序列化/身份验证问题有什么看法?因为两者都有一个模型。就主大厅而言,它不应该局限于特定的用户,但我不希望其他用户能够获取他们不拥有的私人消息。这可能会给我带来一些问题,还是我不应该对此太担心?
filterset_fields = ['lobby__title',]