Приносим извинения, если то, что я здесь делаю, сделано намеренно или я просто делаю что-то совершенно неправильно, но я думаю, что использование prepend_urls для создания вложенного ресурса обходит аутентификацию как для родительского, так и для дочернего ресурса. Я создал пример, аналогичный приведенному в Cookbook, и создал дочерний ресурс с использованием аутентификации ApiKey, и я могу получить к нему доступ, несмотря на то, что не передал правильные заголовки. Родительский ресурс также требует аутентификации ApiKey.
Что я вижу без заголовков аутентификации:
GET / api / v1 / article - 401, как и ожидалось
GET / api / v1 / article / 1 / - 401, как ожидалось
GET / api / v1 / article / 1 / tags - неожиданно возвращается список тегов.
Мне кажется, что это неверно и уж точно не то, что я ожидал увидеть.
По моему опыту, гораздо проще и элегантнее использовать только функцию override_urls и создать собственный дочерний метод отправки. Это меньше кода, соблюдает все мета-свойства вашего дочернего ресурса (включая аутентификацию), а также некоторые другие.
Пример:
def override_urls(self):
return [
url(r'^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/tags%s$' % (self._meta.resource_name, trailing_slash()), self.wrap_view('dispatch_tags'), name='api_article_tags'),
]
def dispatch_tags(self, request, **kwargs):
return ArticleTagResource().dispatch('list', request, **kwargs)
Это в основном позволяет вашему ArticleTagResource обрабатывать весь запрос из / article / 1 / tags /, как если бы он был запрошен как представление списка (измените «список» на «деталь», чтобы он вел себя как подробное представление).
Я еще не пробовал это сделать, но если это сработает, как вы говорите, я определенно буду подходить к нему. Тем не менее, я все еще думаю, что то, что я здесь сообщил, является проблемой с Tastypie - в основном, если вы используете метод, показанный в кулинарной книге, аутентификацию можно полностью обойти, даже если разработчик даже не осознает.
У меня такая же проблема, и я попробовал метод joeribekker с теми же результатами, есть идеи, когда это будет исправлено? или какие-то обходные пути?
Мне нравится идея использовать Resource.dispatch()
, но если вы хотите сделать что-то более сложное, чем просмотр деталей или список, то это не совсем жизнеспособно.
Одно из решений, о котором я думал, - это переместить часть более тяжелого подъема из Resource.dispatch()
в Resource.wrap_view()
чтобы можно было использовать wrap_view()
для произвольного обертывания любого представления, применяя все правила аутентификации, авторизации и регулирования (возможно, проверка метода тоже, хотя об этом ниже).
Я столкнулся с этой проблемой с дросселированием. Мой текущий обходной путь - иметь декоратор, в который я помещаю свои пользовательские представления: @apply_throttle
. Декоратор более или менее копирует код из Resource.throttle_check()
и Resource.log_throttled_access()
.
Для вкусного пирога может быть наиболее эффективным иметь как более полные wrap_view()
(включая вышеперечисленные) _и_ декораторы (или какой-либо другой способ выборочного применения этих вещей) на тот случай, если разработчик намерен использовать переопределения для фактически обойти нормальное поведение (например, если у вас есть переопределенная конечная точка, которая требует другого регулирования или ослабляет требования аутентификации). Декораторы также были бы хорошим способом применить определенные проверки метода (GET, POST и т. Д.) Для переопределений, без необходимости иметь этот шаблон в начале вашего метода. Я знаю, что использовал переопределения там, где все это было бы полезно.
Что все думают о таком решении? Мне определенно интересно поработать над этим, но сейчас у меня мало времени.
Я боролся с этим, но я нашел и ответил на SO.
http://stackoverflow.com/questions/11827368/tastypie-override-urls-ignores-authentication-and-authorization
Это старый поток, но поскольку проблемы все еще открыты и занимают высокое место в моем поиске ... обращение к
self.is_authenticated(request)
в первой строке обработчика позаботится об этой проблеме. тестировалось с вкусным пирогом 0.11 и 0.12.
Книга рецептов теперь рекомендует использовать self.wrap_view () внутри prepend_urls (), закрывая эту проблему.
Событие с wrap_view, мне нужно self.is_authenticated(request)
в методе обработчика.
Самый полезный комментарий
Я еще не пробовал это сделать, но если это сработает, как вы говорите, я определенно буду подходить к нему. Тем не менее, я все еще думаю, что то, что я здесь сообщил, является проблемой с Tastypie - в основном, если вы используете метод, показанный в кулинарной книге, аутентификацию можно полностью обойти, даже если разработчик даже не осознает.