2010-08-27 1 views
3

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

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

Из документов Поршневые:

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

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

ответ

0

Я не знаю поршня 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 от промежуточного программного обеспечения

Если вы хотите просто получить кур nt, изменить промежуточное программное обеспечение, чтобы установить только request.user в резьбе местных жителей

+1

Приятное обходное решение для того, что, по-видимому, является недостатком API-поршней. Я думаю, что настоящий «правильный» ответ должен быть чем-то совершенно другим, но это сделало трюк, спасибо! –

0

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

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 

EDIT: Еще немного Hacky способ сделать это (если вы не хотите, чтобы друг, чтобы прошло вообще, если is_friended ложно) будет вручную создать объект Dict структурированный как вам нравится, а затем вернуть его. поршневые процессы диктовать работы со встроенными излучателями (JSON один, конечно, не пробовал другие)

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