Несколько вопросов по отладке приложений с помощью
paste.httpserver.serve().
Я начал портировать python-web-приложение "Submin" http://supermind.nl/submin/
под Windows.
Запускаю через WSGI. Использую 2 варианта запуска:
1. Apache + mod_wsgi (будет продакшн)
2. Для отладки, описанным в нижеуказаноой статье способом через
paste.serve()
http://www.developers.org.ua/archives/mlk/2008/05/20/python-webdev-no-frameworks-p4/
В Апаче все работает относительно нормально, а serve() не отдает
статику...
Как прописать алиасы для статических файлов в serve()?
Можно ли через serve() запустить приложение не в корне, а в подпапке?
Например так http://localhost:8080/submin/
Можно ли изменять environ, передаваемый от serve() к wsgi-приложению?
Хочется сказать Щетинину Сергею "Большое Человеческое Спасибо" за
статью, но у меня все равно много вопросов... Извините если
"нубовские", я в питоне недавно... :)
Мой e-mail: dremlin.ru __ @ __ gmail.com
Прошу помощи... Гугль только запутал меня еще хуже.
Сергей.
ЗЫ: Все это нужно в основном, для отладки... Отлаживать на Апаче
проблематично в связи с необходимостью постоянного рестарта после
правки кода...
И еще environ, который отдает Апач сильно отличается от того, что дает
serve(). Взять хотя бы отсутствующий во втором environ['REQUEST_URI'].
Поэтому для совместимости основного wsgi-скрипта с обоими серверами
приходиться "морщить ум".
Может взять что-то другое для отладки? Сам работаю в PyDEV.
Спасибо.
Для того чтобы это сделать надо понять что всё приложение целиком
должно быть WSGI приложением и что оно может быть составным. В данном
случае нужно использовать URLMap
from paste.urlmap import URLMap
from paste.urlparser import StaticURLParser
root_app = URLMap()
root_app['/submin'] = submin_app
root_app['/static'] = StaticURLParser('/www/static')
serve(root_app)
> Можно ли изменять environ, передаваемый от serve() к wsgi-приложению?
Можно, но желательно делать это предварительно его копируя. Я так
думаю вам надо разобраться с wsgi middleware -- похоже именно оно и
надо.
> ЗЫ: Все это нужно в основном, для отладки... Отлаживать на Апаче
> проблематично в связи с необходимостью постоянного рестарта после
> правки кода...
>
> И еще environ, который отдает Апач сильно отличается от того, что дает
> serve(). Взять хотя бы отсутствующий во втором environ['REQUEST_URI'].
> Поэтому для совместимости основного wsgi-скрипта с обоими серверами
> приходиться "морщить ум".
Не надо работать с environ напрямую, тем более не будучи хорошо
знакомым с WSGI стандартом. WSGI приложения надо писать с помощью
WebOb (URI запроса будет в req.uri).
> Может взять что-то другое для отладки? Сам работаю в PyDEV.
Я использую вариации на тему evalexception (упомянуто в конце первой части).
[перенес в конец сообщ.]
> Хочется сказать Щетинину Сергею "Большое Человеческое Спасибо" за
> статью, но у меня все равно много вопросов... Извините если
> "нубовские", я в питоне недавно... :)
На здоровье. Вопросы нормальные, но старайтесь следовать рекомендациям
ближе, потом может начнете писать по-своему (в данном речь о environ
-- его не надо трогать совсем, делайте всё через WebOb).
--
Best Regards,
Sergey Schetinin
http://s3bk.com/ -- S3 Backup
http://word-to-html.com/ -- Word to HTML Converter
Вот оно что! А я здесь вызывал:
serve(submin_app)
И не мапилось ничего.
> > Можно ли изменять environ, передаваемый от serve() к wsgi-приложению?
>
> Можно, но желательно делать это предварительно его копируя. Я так
> думаю вам надо разобраться с wsgi middleware -- похоже именно оно и
> надо.
> Не надо работать с environ напрямую, тем более не будучи хорошо
> знакомым с WSGI стандартом. WSGI приложения надо писать с помощью
> WebOb (URI запроса будет в req.uri).
> ...
> На здоровье. Вопросы нормальные, но старайтесь следовать рекомендациям
> ближе, потом может начнете писать по-своему (в данном речь о environ
> -- его не надо трогать совсем, делайте всё через WebOb).
Основная проблема то как раз заключается в том, что я портирую "чужое"
приложение, написанное для debian linux + apache + wsgi + python для
работы на win32 платформе. И с этим есть определенные трудности.
"Сильно" изменять, не мной написанное приложение недопустимо, а оно
использует environ'ы напрямую... Я хочу чтобы моя работа органично
влилась в этот проект.
Так что это не моя прихоть, а суровая правда жизни ;)
Если соберусь писать свое приложение с нуля сам, то обязательно буду
использовать Ваш опыт, но в данном случае - вариант WebOb не подходит :
(
Так что Вы говорили насчет paste wsgi middleware?
Я бы запускал из стартового дебагерного скрипта это wsgi-приложение,
предварительно подправив окружение на нужное, а основная программа
даже и не узнает о том, что она не в апече ;)
Вот как-то так... Еще раз спасибо.
Сергей.
А, раз приложение чужое, тогда конечно.
> Так что Вы говорили насчет paste wsgi middleware?
> Я бы запускал из стартового дебагерного скрипта это wsgi-приложение,
> предварительно подправив окружение на нужное, а основная программа
> даже и не узнает о том, что она не в апече ;)
>
> Вот как-то так... Еще раз спасибо.
Если програма якобы WSGI но ожидает какие-то ключи которые дает только
апач, то это надо программу править, т.е. не подстоить environ под её
ожидания надо, исправить её ожидания. URI или даже пути в чистом виде
в environ нет, только его части.
Это выходит за рамки моих возможностей. Логика редиректов в программе
использует
значение environ['REQUEST_URI'], а его как раз serve() не выдает.
Создаю её (environ['REQUEST_URI']) прямо в оригинальном коде wsgi-
приложения "submin.wsgi" перед вызовом WSGIRequest примерно так:
if os.environ.has_key('SERVER_SOFTWARE'):
if os.environ['SERVER_SOFTWARE'] == 'PasteWSGIServer':
environ['REQUEST_URI'] = base_url + environ['PATH_INFO']
req = WSGIRequest(environ)
response = dispatcher(req)
start_response(response.status(), response.headers.items())
return [response.content.encode('utf-8')]
Бред конечно, но работает!
Дополнительно активно используются специфические переменные окружения:
*) environ['SCRIPT_FILENAME'] - Апаче-МодWSGIшная переменная:
Путь до wsgi-приложения. Вданном случае - "submin.wsgi". В конфиге
Апача задается так:
WSGIScriptAlias /submin "D:/Test/QWinRails/webapps/submin/www/
submin.wsgi"
*) environ['SUBMIN_CONF'] - Апаче-Субминовская переменная:
Путь к файлу настройки приложения. В конфиге Апача задается так:
<Location /submin>
SetEnv SUBMIN_CONF "D:/Test/QWinRails/webapps/submin/conf/
default.conf"
</Location>
Мне необходимо понять, как подогнать окружение под приложение, чтобы
не портить оригинальный код "submin.wsgi", разного рода проверялками и
подстановками...
Спасибо.
ЗЫ: Предыдущий совет по URLMap() очень помог. Теперь приложение
работает в подпапке, статика пошла. Осталось победить окружение.
Сергей.
Если код приложения менять нельзя, то конечно придется делать таким
образом, но вообще это значит что submin нарушает стандарт, зря они
так.