Python Paste. Вопросы по отладке приложений...

22 views
Skip to first unread message

DremLIN.Ru

unread,
Nov 27, 2009, 1:30:49 AM11/27/09
to Пишем на Python лучше
Здравствуйте,

Несколько вопросов по отладке приложений с помощью
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.

Спасибо.

Sergey Schetinin

unread,
Nov 27, 2009, 2:33:02 AM11/27/09
to better-python-ru
2009/11/27 DremLIN.Ru <dreml...@gmail.com>:

> В Апаче все работает относительно нормально, а serve() не отдает
> статику...
>
> Как прописать алиасы для статических файлов в serve()?
>
> Можно ли через serve() запустить приложение не в корне, а в подпапке?
> Например так http://localhost:8080/submin/

Для того чтобы это сделать надо понять что всё приложение целиком
должно быть 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

DremLIN.Ru

unread,
Nov 27, 2009, 5:06:14 AM11/27/09
to Пишем на Python лучше
On 27 ноя, 11:33, Sergey Schetinin <mal...@gmail.com> wrote:
> 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)

Вот оно что! А я здесь вызывал:

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-приложение,
предварительно подправив окружение на нужное, а основная программа
даже и не узнает о том, что она не в апече ;)

Вот как-то так... Еще раз спасибо.

Сергей.

Sergey Schetinin

unread,
Nov 27, 2009, 5:12:13 AM11/27/09
to better-python-ru
2009/11/27 DremLIN.Ru <dreml...@gmail.com>:

>> > Можно ли изменять 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-приложение,
> предварительно подправив окружение на нужное, а основная программа
> даже и не узнает о том, что она не в апече ;)
>
> Вот как-то так... Еще раз спасибо.

Если програма якобы WSGI но ожидает какие-то ключи которые дает только
апач, то это надо программу править, т.е. не подстоить environ под её
ожидания надо, исправить её ожидания. URI или даже пути в чистом виде
в environ нет, только его части.

DremLIN.Ru

unread,
Nov 27, 2009, 6:57:19 AM11/27/09
to Пишем на Python лучше
On 27 ноя, 14:12, Sergey Schetinin <mal...@gmail.com> wrote:
>
> Если програма якобы 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() очень помог. Теперь приложение
работает в подпапке, статика пошла. Осталось победить окружение.

Сергей.

Sergey Schetinin

unread,
Nov 27, 2009, 7:46:30 AM11/27/09
to better-python-ru
2009/11/27 DremLIN.Ru <dreml...@gmail.com>:

Если код приложения менять нельзя, то конечно придется делать таким
образом, но вообще это значит что submin нарушает стандарт, зря они
так.

Reply all
Reply to author
Forward
0 new messages