2010-11-04 3 views
0

Я пытаюсь выборочно обрабатывать поле в приложении Django/Python на основе того, вошел ли пользователь в систему или нет. В принципе, у меня есть модель, аналогичную следующей:Установка значения поля модели на основе аутентификации пользователя в Django

class Resource(models.Model): 
    uploaded = models.DateTimeField() 
    name = models.CharField(max_length=200) 
    description = models.CharField(max_length=500, blank=True) 
    file = models.CharField(max_length=200) 

То, что я хочу сделать, это для атрибута файла должен быть установлен в одно значение, если пользователь случается быть зарегистрированным (и имеет доступ к этому ресурсу на основе на тесте против некоторых разрешений) и другое значение, если пользователь не вошел в систему. Таким образом, когда какой-либо клиентский код пытается получить доступ к Resource.file, он получит что-то вроде следующего, если пользователь не войдет в систему «http: //mysite.com/dummy_resource_for_people_without_access. Однако, если пользователь вошел в систему и прошел несколько тестов для разрешений, то значение ресурса будет фактически истинным URL-адресом этого ресурса (включая любые ключи безопасности и т. Д. Для доступа к этому ресурсу).

Из того, что я прочитал, кажется, что вы можете учитывать только зарегистрированного пользователя, передав его через контекст запроса из функции просмотра в модель. Однако в приведенном выше примере использования я пытаюсь более точно контролировать доступ в модели, не требуя, чтобы клиентский код вызывал специальную функцию.

+1

Нужно ли хранить URL-адрес в базе данных или его можно генерировать динамически? Возможность доступа к пользователю/запросу в модели не должна быть возможной в django для различных лучших методов проектирования; вы всегда должны передавать объект пользователя или пересматривать свой дизайн! –

+0

URL-адрес должен генерироваться динамически, используя ключ файла вместе с другими данными безопасности. – Faisal

ответ

0

На всякий случай кого-то заинтересовало, я решил проблему выше, фактически создав собственное поле модели в django, которое затем может иметь метод, который требует от пользователя создания URI. Итак, в базе данных я храню ключ к ресурсу, как указано выше в столбце файла. Тем не менее, теперь столбец файла некоторые пользовательские поля:

class CustomFileField(models.CharField): 
    def to_python(self, value): 
     ... 
     return CustomFileResource(value) 


class CustomFileResource: 
    def __init__(self, *args, **kwargs): 
     .... 

    def uri(usr): 
     #this method then gets the uri selectively based on the user . 

Узор выше приятно, потому что я могу обернуть поле БД, а затем создать конкретный метод для получения Ури, основанный на том, кто пытается получить к нему доступ.

0

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

Как правило, Django предназначен для аутентификации на уровне представления (и делает это очень чисто). Если вам нужна аутентификация уровня базы данных, рассмотрите другую настройку, такую ​​как CouchDB.

+0

Да, я догадался, что на основе всех документов, но надеялся, что есть какой-то трюк. То, что я собираюсь сделать, - это просто создать отдельный тег шаблона и функцию уровня представления, которую я вызываю всякий раз, когда мне нужно преобразовать ключ файла в моей модели в действительный URL-адрес, проверенный на наличие разрешений. Было бы неплохо сделать это легко, но я понимаю недостатки дизайна в сеансах работы на уровне модели. – Faisal

Смежные вопросы