Как заставить URL-маршрутизацию выполняться после StaticMiddleware в web.py

У меня есть URL-маршрут в моем приложении web.py, который я хочу запустить, чтобы перехватить все URL-адреса, попадающие на сервер, но только после того, как будут обработаны любые статические ресурсы.

Например, если в моем каталоге static есть js/test.js, путь http://a.com/js/tests.js должен возвращать содержимое файла. Но у меня также настроена маршрутизация URL-адресов, так что есть регулярное выражение, которое улавливает все следующим образом:

urls = ('/.*', 'CatchAllHandler')

Таким образом, это должно работать только, если статический ресурс не обнаружен. Запрос на http://a.com/js/test.js должен возвращать статический файл test.js, а запрос на http://a.com/js/nope.js должен проходить через файл CatchAllHandler.

Я пытался написать для этого свой собственный StaticMiddleware, но это поможет только в том случае, если порядок операций web.py будет изменен. В настоящее время промежуточное ПО выполняется после обработки URL-маршрутов. Мне нужно, чтобы промежуточное ПО запускалось первым, а маршрутизация URL-адресов очищала запросы, которые не обслуживались статическими активами.

У меня есть одна идея — использовать функцию notfound() в качестве обработчика всех событий, но это может быть не лучшим решением.


person Matthew Taylor    schedule 14.01.2012    source источник


Ответы (3)


URL-адрес соответствует python regex. Вы можете протестировать/поиграть с регулярным выражением python здесь

тем не менее, это должно сработать для вас:

('/(?!static)(.*)', 'CatchAllHandler')
person tara    schedule 14.01.2012
comment
Я закончил тем, что сделал это, но это не совсем то исправление, которое я хотел. Я хотел знать, есть ли способ позволить любому промежуточному программному обеспечению выполняться против запросов до того, как будет выполнена маршрутизация URL. Таким образом, не имеет значения, какой URL-адрес содержит статические файлы. - person Matthew Taylor; 15.01.2012

Я не играл с промежуточным программным обеспечением web.py, но насколько я понимаю. Промежуточное программное обеспечение WSGI происходит до того, как web.py увидит запрос/ответ. Я думаю, что если ваш WSGI MiddleWare правильно настроен, он просто будет работать.

person tara    schedule 17.01.2012
comment
дуется Это отстой. Есть материал add_handler, который делает его очень простым.. но я думаю, что касается вашего другого комментария, «желание, чтобы он работал независимо от URL-адреса». Иначе как бы вы узнали, что это статический контент? Я сильно запутался. САМЫЙ ПРОСТОЙ способ, поскольку для производства вы хотите, чтобы что-то вроде mod_wsgi запускало ваши сценарии web.py, — это отправить весь статический контент на веб-сервер. Тогда вы, конечно, можете делать на веб-сервере все, что вам нужно. - person tara; 06.02.2012

дуется Это отстой. Есть хуки, которые делают это действительно простым, я не делал этого раньше, и он увидит все, прежде чем .. документы здесь: http://webpy.org/cookbook/application_processors

но я предполагаю, что в отношении вашего другого комментария «хочу, чтобы он работал независимо от URL». Иначе как бы вы узнали, что это статический контент? Я сильно запутался. САМЫЙ ПРОСТОЙ способ, поскольку для производства вам нужен какой-то другой веб-сервер, выполняющий ваши сценарии web.py, — это отправить все статическое содержимое на веб-сервер. Тогда вы, конечно, можете делать на веб-сервере все, что вам нужно. Это именно то, что происходит, например, с mod_wsgi и apache (вы меняете /static, чтобы указать на каталог IN веб-сервера).

Возможно, если бы вы поделились реальным примером того, что вам нужно сделать, я мог бы помочь вам больше. В противном случае я дал вам 3 различных способа решения проблемы (исключая использование промежуточного программного обеспечения WSGI). Сколько еще вам нужно? :П

person tara    schedule 06.02.2012