Питон - статьи


Практика - часть 3


def serve(self): reactor.listenTCP(8080, self.factory) reactor.run()

def runner(app): TwistedWSGIServer(app).serve()

if __name__ == '__main__': import sys import helper

app = helper.get_arg(sys.argv, "Usage: twisted_wsgi_server.py package.wsgi.app") runner(app)

Здесь мы воспользовались WSGI-сервером, встроенным в Twisted Web2, ну а процедура старта Twisted-приложения описана здесь.

Теперь пробуем запустить с нашим приложением:

twisted_wsgi_server.py trivial_wsgi_app.app

Работает. Еще больше усложним задачу и напишем Nevow-приложение с WSGI-интерфейсом (правда, с некоторыми оговорками):

from nevow import rend, loaders, wsgi, tags, inevow

class NevowPage(rend.Page):

addSlash = True

docFactory = loaders.stan( tags.html[ tags.head[tags.title['Nevow WSGI hello app']], tags.body[ tags.h1(id='title')['Nevow WSGI hello app'], tags.p(id='welcome')['Welcome to the Nevow (WSGI powered). Just show your environment.'], tags.p(id='environment')[tags.invisible(render=tags.directive('environ'))] ] ] )

def render_environ(self, context, data): environ = inevow.IRequest(context).environ sorted_keys = environ.keys() sorted_keys.sort() inner = [tags.li[k, " => ", str(environ[k])] for k in sorted_keys] return tags.ul[inner]

app = wsgi.createWSGIApplication(NevowPage())

if __name__ == '__main__': import sys import helper

server = helper.get_arg(sys.argv, "Usage: nevow_wsgi_app.py package.wsgi.server_callable") server(get_wsgi_app())

Особо углубляться в код не буду, тем более, что есть желание сделать Nevow одной из тем разговора.

Теперь можно комбинировать WSGI-сервера и WSGI-приложения в любых сочетаниях - результат будем идентичным. Естественно, что часть возможностей, которые не укладываются в WSGI, будут недоступны. Напримерб в Twisted Web2, WSGI-приложение выполняется в отдельном потоке, так что воспользоваться асинхронными "фишками" Twisted не получится. Поэтому использовать Nevow с Twisted через WSGI - нонсенс. Об использовании Twisted в веб-приложениях, я думаю, расскажу в ближайшее время.А приведенный код можно получить с code.google.com.




Начало  Назад  Вперед