Как получить доступ к request.user в методе класса Piston - PullRequest
3 голосов
/ 27 августа 2010

У меня есть модель, которая содержит ManyToMany для пользователя, чтобы отслеживать, какие пользователи «добавили в избранное» конкретный экземпляр модели.

В моем API для этой модели по запросу аутентифицированного пользователя яЯ хотел бы включить логическое значение is_favorite.Однако, кажется, что любые поля API, которые не являются прямыми атрибутами модели, должны быть реализованы как метод класса, который при вызове в Piston не получает ссылку на объект запроса, и поэтому у меня нет возможности узнать, кто является текущим пользователем.is.

Из документации Piston:

В дополнение к ним, вы можете определить любые другие методы, которые вы хотите.Вы можете использовать их, включив их имена в директиву fields, и, таким образом, функция будет вызываться с одним аргументом: экземпляр модели. Затем она может вернуть что угодно и возвращаемое значениебудет использоваться в качестве значения для этого ключа.

Итак, если только методы Piston CRUD получают экземпляр запроса, как мои поля classmethod могут генерировать выходные данные, которые актуальны для текущего аутентифицированного пользователя?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2011

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

class FriendHandler(BaseHandler):
    allowed_methods = ('GET',)
    model = User
    fields = ('userfield_1', 'userfield_2', ('friends', ('is_friended')))

    def read(self, request):
        # Anything else you might want to do, but return an object of type User
        # Or whatever your model happens to be called

РЕДАКТИРОВАТЬ: Еще один слегка хакерский способ сделать это (если вы не хотите, чтобы друга вообще пропустили, если is_friended имеет значение false), было бывручную создайте объект dict, структурированный так, как вам нравится, а затем верните его.поршень обрабатывает диктовку с помощью встроенных излучателей (JSON точно, другие не пробовал)

0 голосов
/ 27 августа 2010

Я не знаю API-интерфейс поршня, но как насчет использования промежуточного программного обеспечения локальных потоков для доступа к запросу

, добавьте это в промежуточное программное обеспечение

try:                                                                    
    from threading import local                                         
except ImportError:                                                     
    from django.utils._threading_local import local                     

_thread_locals = local()                                                
def get_request():                                                
    return getattr(_thread_locals, 'request', None)                       

class ThreadLocals(object):                                             
    def process_request(self, request):                                 
        _thread_locals.request = request

и обновите настройки с помощью ThreadLocalsпромежуточное ПО

и везде, где вы хотите получить доступ к запросу import get_request из промежуточного ПО

, если вы хотите просто получить текущего пользователя, измените промежуточное ПО, указав только request.user в локальных потоках

...