Разрешения на страницу пользователя обновляются только при перезапуске сервера с Django-CMS

По сути, у меня возникла проблема, когда у меня есть страница, использующая платформу отдыха, которая редактирует разрешения пользователя (я использую пользовательское приложение django по умолчанию) путем изменения групп или изменения другой второстепенной информации, такой как имя и пароль. Однако, когда я редактирую группу пользователя и только когда я их редактирую, по какой-то причине права пользователя меняются только при перезапуске сервера django, позволяя пользователю просматривать страницы django cms, которые он не должен видеть. После перезагрузки сервера все разрешения работают нормально.

Я уже пытался принудительно обновить разрешения следующим образом:

for app in settings.INSTALLED_APPS:
    create_permissions(apps.get_app_config(app.split(".")[-1]))

но это не сработало.

На самом деле я понятия не имею, в чем причина проблемы, настолько, что я не уверен, какой код я мог бы здесь разместить, поэтому, сомневаясь, я опубликую сериализатор остальных пользователей:

# -*- coding: utf-8 -*-
from rest_framework import serializers
from django.contrib.auth.models import User


class UserSerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        super(UserSerializer, self).__init__(*args, **kwargs)
        self.fields['username'].label = u"Usuário"
        self.fields['password'].label = u"Senha"
        self.fields['first_name'].label = u"Nome Completo"

    group_name = serializers.SerializerMethodField()

    def get_group_name(self, obj):
        return ", ".join(list(obj.groups.values_list('name',flat=True)))

    def create(self, validated_data):
        user = super(UserSerializer, self).create(validated_data)
        user.set_password(validated_data['password'])
        user.save()
        return user

    def update(self, instance, validated_data):
        user = super(UserSerializer, self).update(instance, validated_data)
        if "password" in validated_data:
            user.set_password(validated_data['password'])
        user.save()

        return user


    class Meta:
        model = User
        fields = [
            "id",
            "first_name",
            "username",
            "password",
            "group_name",
            "groups",
            "is_active",
        ]

Вы используете какой-то кеш? Если вы перезапустите и разрешения в порядке, ваша функциональность сохранит изменения, как и ожидалось. Проверьте, есть ли у вас кеш или вы каким-то образом полагаетесь на request.session.

Raydel Miranda 24.01.2019 22:18

Нет, не использую кеш, если только не используется django cms или rest framework, однако django cms действительно имеет кеш perms, но я отключил его в настройках с помощью CMS_PAGE_CACHE = CMS_PLACEHOLDER_CACHE = CMS_PLUGIN_CACHE = False. Но в документах говорится, что он не записывает указанный кеш если страница требует входа в систему, и они все равно это делают.

Leandro Benedet Garcia 24.01.2019 22:54
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
323
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Недостаточно репутации, чтобы просто оставить комментарий, к сожалению. Но некоторые вещи, чтобы искать. И посоветуйте, что дополнить.

Вы правильно проверяете/обновляете разрешения? Самый простой способ сделать это — просто добавить сообщение в журнал сразу после того, как вы измените разрешение с тем, что система говорит о текущих разрешениях.

https://docs.djangoproject.com/en/2.1/topics/auth/default/#permission-caching

user.user_permissions.add(permission)

# Checking the cached permission set
user.has_perm('myapp.change_blogpost')  # False

Ну, я знаю, что он правильно устанавливает разрешение, потому что я установил его через остальную структуру, а затем он также обновляется в админке. Но проблема в том, что по какой-то причине, когда я редактирую группы, которые есть у пользователя, страницы, которые этому пользователю больше не должны быть разрешены, все еще могут быть доступны ему, но настройки работают после перезапуска сервера. Также. Что обрабатывает, если пользователь может просматривать страницу, это CMS django, поэтому я не знаю, сработает ли проверка perm, я даже не уверен, как бы я сделал это с помощью django cms, и нет документации о том, как сделать это программно .

Leandro Benedet Garcia 25.01.2019 00:08
Ответ принят как подходящий

Итак, проблема заключалась в кешировании меню, а django CMS, похоже, не так хороша с кешем. Поэтому я просто отключил весь кеш, который должен был быть отключен первой строкой следующего кода, но фактически отключил только добавление CMS_CACHE_DURATIONS в settings.py:

CMS_PAGE_CACHE = CMS_PLACEHOLDER_CACHE = CMS_PLUGIN_CACHE = False
CMS_CACHE_DURATIONS = {
    'menus': 0,
    'content': 0,
    'permissions': 0,
}

Другие вопросы по теме