Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Веб-разработка и фреймворки > [Django] Вызов проверки по определенному урлу


Автор: ecspertiza 2.8.2013, 08:45
День добрый, есть задача выполнять некоторую проверку при вызове определенного урла, например если урл начинается с 

Код

api/


и собственно все что содержит api/ , например

api/
api/auth/
api/soft/

и т.д.

то нужно выполнить некоторую проверку, и в ней вернуть результат либо продолжить выполнение дальше. Конечно можно выполнять проверку в каждой ф-ции по отдельности. Но это дублирование кода и мне это не очень нравится. Можно ли как то написать проверку в одном месте, которая постоянно будет вызываться если в начале урла есть api/ ?

Автор: SoWa 21.8.2013, 20:12
https://docs.djangoproject.com/en/dev/topics/http/middleware/ вам в помощь

Автор: bilbobagginz 5.9.2013, 18:07
ecspertiza, 
я не уверен, что нужно вообще какие-то джанговые суперструменты, но может быть имеет смысл действительно заюзать модуль middleware.

если я правильно понял механизм работы этого мидлвера, с т.з. управления рисками, я бы не хотел огрести с такими system wide компонентами:
каждый запрос видимо будет обрабатываться каким-то обработчиком/хуком, и я уверен, что его можно написать так, что он будет
  • отлавливать запросы не принадлежащие API
  • не отлавливать запросы принадлежащие API
  • увеличивать время обработки ВСЕХ запросов системы
т.е. имеет потенциал ударить и по корректности и по быстродействию (судя по опыту с контекст процессорами, все это не очень приятно в отладке, особенно, если пишет код один человек, а другой отлаживает)

Поэтому, я бы (для начала) попробовал по методу KISS, т.е. попроще, шаблон - decorator в питоновом контексте.
декорировать можно:
  • методы explicitly, т.е. как "в книжке" о декораторах, прицеплять декоратор во views.py по методам (сработает, но труднее поддерживать такой код: каждый новый функционал твоего API надо будет не забыть декорировать)
  • в url.py, как напр. http://djangosnippets.org/snippets/532/
А после внедрения данного решения, я бы сделал экспериментик (POC) с джанговым миддлвером, т.е. сделал бы тестик-бенчмарк на всякий случай.
(Ессно, если время есть на такие игры)


SoWa, миддлвер случаем не приклеивается ко всем запросам ? (судя по https://docs.djangoproject.com/en/dev/topics/http/middleware/#hooks-and-application-order таки да, он вроде как контекст-процессор, но только в слоях запросов а не обработки шаблонов)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)