LINUX.ORG.RU

Помогите запустить Bottle через Apache CGI


0

1

Решил попробовать Bottle, для начала решил поэкспериментировать на домашнем компе. Скачал файл bottle.py, с помощью 2to3 (как понял так многие делали) переконвертил прогу в Python3. В папку cgi-bin запихнул index/py (взял отсюда):

#!/usr/bin/python3
import sys
sys.path.append("/home/sonylinux")
import bottle
from bottle import route

@route('/')
def index():
    return 'Index'

@route('/hello')
def hello():
    return 'Hello'

if __name__ == '__main__':
    from wsgiref.handlers import CGIHandler
    CGIHandler().run(bottle.default_app())

Получил ожидаемую ошибку 500 error при переходе на localhost/cgi-bin/index.py, вот что пишет /var/log/apache2/error.log:

[Sun Oct 10 16:38:15 2010] [error] [client ::1] Premature end of script headers: index.py
Traceback (most recent call last):
  File "/usr/lib/python3.1/wsgiref/handlers.py", line 75, in run
    self.finish_response()
  File "/usr/lib/python3.1/wsgiref/handlers.py", line 116, in finish_response
    self.write(data)
  File "/usr/lib/python3.1/wsgiref/handlers.py", line 210, in write
    self.send_headers()
  File "/usr/lib/python3.1/wsgiref/handlers.py", line 266, in send_headers
    self.send_preamble()
  File "/usr/lib/python3.1/wsgiref/handlers.py", line 196, in send_preamble
    self._write('Status: %s\r\n' % self.status)
  File "/usr/lib/python3.1/wsgiref/handlers.py", line 402, in _write
    self.stdout.write(data)
TypeError: must be str, not bytes
[Sun Oct 10 16:53:09 2010] [error] [client ::1] Premature end of script headers: index.py
На хостинге есть только CGI, сам скомпилировал Python3, т.к. в /usr/bin стоит только python 2.4(недостаточно для bottle) - с этим и связаны нестандартные решения.

Помогите, пожалуйста, разобраться

Попробовал на Python26 все работает, значит проблема в конвертировании. Очень хочется работать на py3 - многое, что уже написано, на старом работать не будет

Конвертирую так: 2to3 bottle.py

echo $? выдает 0. Вот 10 последних строк вывода программы конвертирования:

@@ -2118,7 +2119,7 @@
TEMPLATES = {}
DEBUG = False
MEMFILE_MAX = 1024*100
-HTTP_CODES = httplib.responses
+HTTP_CODES = http.client.responses
HTTP_CODES[418] = «I'm a teapot» # RFC 2324

ERROR_PAGE_TEMPLATE = SimpleTemplate(«»"
RefactoringTool: Files that need to be modified:
RefactoringTool: bottle_deb.py

Вроде все нормально. На форумах народ пишет, что сконвертировали и все работает, но все скорее всего работают через wsgi. Может дело CGI? Не знаю, что еще можно сделать

alexkarta
() автор топика

Недавно делал с bottle маленький проектик. Очень-очень маленький, но две мысли для себя извлек :)

Не надо конвертировать - на ровном месте переодически появляются баги, которых нет с py2.6

Лучше не использовать стандартный шаблонизатор. Он ужасен и иногда валится с труднопонятными эксепшенами.

portalgun
()

>self.stdout.write(data)

TypeError: must be str, not bytes

Ну тебе же всё написали. Открывай исходники своего bottle, бери в руки pdb и смотри, где у тебя data, отсылаемая куда надо, становится byte, и сделай чтобы оно стало строкой.

Там исходников то на вид совсем немного.

anonymous
()
Ответ на: комментарий от anonymous

> Ну тебе же всё написали. Открывай исходники своего bottle, бери в руки pdb и смотри, где у тебя data, отсылаемая куда надо, становится byte, и сделай чтобы оно стало строкой.


вобщето можно поступить подругому — можно всеголишь сделать WSGI-Middleware, который будет приобразовывать data в нужный тип.. исходя из результатов isinstance(...)

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

> вобщето можно поступить подругому — можно всеголишь сделать WSGI-Middleware, который будет приобразовывать data в нужный тип.. исходя из результатов isinstance(...)

кстате говоря это недоработка именно Пайтоновского модуля «wsgiref» , а не wsgi-приложения ..

такая же недароботка есть и в Python-2 . (но там наоборот — требуется везде именно «bytes» а не «unicode»)
..это знают те кто использует в Python-2 повсеместно Unicode..

...выход из проблемы — это опятьже таки Wsgi-Middleware , которая определяет (isinstance) тип входных данных и конвертирует в <тот-тип-который-надо-для-«wsgiref»>

user_id_68054 ★★★★★
()
Ответ на: комментарий от alexkarta

> Пока решил использовать питон 2.7, ...

ну вот сделай:
from __future__ unicode_literals

и в месте с этим попробуй напиши обычный Hello (через CGI и WSGI, который представляет модуль «wsgiref»)

и получишь вероятнее всего туже самую ошибку что и была у тебя с Python-3 :-) :-)

user_id_68054 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.