Django Filters со стратегией / проблемой фильтрации сообщений проверки подлинности Rest Framework в приложении чата - PullRequest
0 голосов
/ 22 декабря 2019

У меня есть бэкэнд Django DRF с аутентификацией пользователя токена. Само приложение представляет собой чат, который состоит из общедоступных лобби и частных тем (потоков между конкретными пользователями). В настоящее время мой файл моделей содержит модель сообщений, которая имеет отношение внешнего ключа к моделям лобби и потоков и сохраняет одно из этих полей как пустое, чтобы определить, относится ли конкретное сообщение к частному потоку или общедоступному лобби.

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

После того, как я закончил разработку лобби и включил аутентификацию, веб-интерфейс прекратил фильтровать сообщения поЗаголовок лобби и просто продолжал просто возвращать мне все сообщения, относящиеся к текущему аутентифицированному пользователю - очевидно, не обращая внимания на любые различия между лобби, с которыми связаны сообщения. Изучив реальный 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

в моемsettings.py Я включил Аутентификацию глобально:

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

    )
}

1 Ответ

1 голос
/ 22 декабря 2019

Обновлено: ваша проблема не имеет отношения к авторизации. Вы добавляете

"REST_FRAMEWORK"

блок настроек, но не указываете бэкэнд фильтра для использования

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',]

}

и заменяете

filter_fields = ('obby__title ',)

с:

filterset_fields = ['lobby__title',]

PS: вам нужно pip install django-filter, если у вас нет

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...