Наиболее шустрый python под lighttpd [?]

feliks28

А какой наиболее правильный способ шустро (т.е. для "под большой нагрузкой") заставить бегать python? (Шустрость, конечно, не в ушерб безопасности)
Перерыл кучу всего в инете: говорят, что шустрее всего через scgi+CherryPy. Но в настройке всего этого я запутался. Как вот на примере просто передать формой (1й скрипт) данные другой странице (2й скрипт)?
Или может быть есть другой более шустрый/безопасный способ.

slonishka

Как вот на примере просто передать формой (1й скрипт) данные другой странице (2й скрипт)?
методом POST?
не понятно, в чем проблема у тебя.
типа есть фронтенд-хттп-сервер, есть питон-бекенд, работающий по протоколу fastcgi.
так?
но ты не можешь настроить, чтобы фронтенд ходил к бекенду по этому протоколу.
так?
или там есть какие-то принципиальные отличия от похапэ, которых я не вижу?
я так понимаю, fastcgi вообще пох на то, какой ты язык используешь, это же interfacing protocol.

conv3rsje

Или может быть есть другой более шустрый/безопасный способ.
reverse proxy + wsgi не подходит? статика на lighttpd (или нгинх динамика в петоне
в качестве сервера можно взять paste или cherrypy, оба довольно шустрые
если охота поразвлекаться, можно fapws2 посмотреть

feliks28

Проблема у меня в том, что я структуру не могу понять.
Вот обычно как: есть файл, при обращении по определенному адресу этотфайл обрабатывается и ответ отсылается пользователю.
А с тем же фреймворком CherryPy, судя по туториалу, есть класс, он передается серверу, тот привязывает порт (80) к классу и при обращении на 80й порт выдает результат этого класса и только... А как другие классы обработать? А как это в зависимости от адреса сделать?..

conv3rsje

А как другие классы обработать? А как это в зависимости от адреса сделать?..
Например, так

feliks28

Т.е. для того чтобы пустить python через scgi нужно еще до кучи всего стороннего задействовать? :shocked:
Простого пути сделать что-то вроде обычного cgi

print "<form action=\"script2.py\"><input type=\"submit\"></form>"

print "Submitted"
нет? :confused:

klyv

такой путь всегда есть.
пишешь в начало файла типа #!/usr/bin/python, даёшь права на запуск в системе и в web-сервере и всё.
только это ну никак не быстро.

vall

делаешь wsgi а потом оборачиваешь его в какой тебе надо wsgi-scgi/fastcgi сервер

conv3rsje

пустить python через scgi
"ты не должен этого хотеть" (ц)
В петоне сейчас принято писать веб-приложения под WSGI
Это довольно просто и очень удобно, но несколько отличается от идеологии принятой в cgi и у пыхпыхов, когда у тя каждый файл делает свое чорное дело и маршрутизация запросов идет в зависимости от их расположения в файловой системе.
Это сложнее в простых случаях, но проще в хоть сколь нибудь более сложных, нежели хомепага
Пример простейшей проги с использованием всги

#!/usr/bin/env python

def app(environ, start):
start("200 Ok", [("Content-Type", "text/plain")])
return ["Yo!"]

from wsgiref.simple_server import make_server
server = make_server("", 8888, app)
server.serve_forever

ЗЫ Совсем забыл, wsgi'шную прогу можно завернуть через произвольный протокол, хоть AJP

feliks28

О'кей, пусть wsgi.
В данном примере один единственный скрипт занимает весь порт целиком и полностью (как и в доках к CherryPy). А как мне сделать для случая выше: один скрипт генерит форму, а второй ее обрабатывает?

conv3rsje


#!/usr/bin/env python
# -*- encoding: utf8 -*-

def get(environ, start):
start("200 Ok", [("Content-Type", "text/html; charset='utf-8'")])
return ["<form action='.' method='post'><input type='submit' value='Пыщь'/>"]

def post(environ, start):
start("200 Ok", [("Content-Type", "text/plain; charset='utf-8'")])
for k, v in environ.items:
yield "%s: %s\n" % (k, v)

def app(environ, start):
method = environ['REQUEST_METHOD']
if method == 'GET':
return get(environ, start)
elif method == 'POST':
return post(environ, start)
else:
raise RuntimeError("Invalid method: %s" % method)

from wsgiref.simple_server import make_server
server = make_server("", 8888, app)
server.serve_forever

feliks28

Хм. Интересно... Ну, допустим, для нескольких форм можно будет использовать hidden поле, чтобы их отличать, а аналог простого перехода по ссылке тогда какой будет?
p.s. Действительно таким образом сайты на питоне пишутся?

conv3rsje

Посмотри ссылку на python-routes которую я выше кидал, там можно что угодно и как угодно
Для маршрутизации у тебя есть куча вариантов, причём hidden поле - не самый лучший.
Например, кроме метода, можно использовать PATH_INFO, можно хоть HTTP_HOST
Собственно проблема эта решается один раз на весь проект. Обычно каким-нибудь стандартным способом.
В принципе, я как-то хотел для себя сделать отображение найденных питоновских модулей в ФС на PATH_INFO, чтоб было как ты в начале просил

feliks28

А эти самые обработки все преимущество по скорости на "нет" не сведут?

conv3rsje

$ cat rt.py 
import time, routes

m = routes.Mapper
m.connect('/merge/{site}/*source/{patchid}')
m.create_regs([])

start = time.time
for i in range(1000):
m.match('/merge/numbers/bob/master/abcd1234')
m.match('/merge/mantis/1234/abcd1234')
print time.time - start
$ python rt.py
0.0617690086365

Тебе жалко 5 * 10^-5 секунд на маршрутизацию запроса? :)

Werdna

А какой наиболее правильный способ шустро (т.е. для "под большой нагрузкой") заставить бегать python?
смотреть в сторону fastcgi.
а также nginx, нахуй лайти.
Оставить комментарий
Имя или ник:
Комментарий: