Автор Тема: [Решено] Python CGI не обрабатывает формы, но в целом работает  (Прочитано 2964 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн agentgoblin

  • Активный пользователь
  • **
  • Topic Author
  • Сообщений: 50
[ot]Заранее хочу попросить любителей фреймворков удалиться из темы.[/ot]

Проблема такая: есть Debian Jessie, Lighttpd 1.4.35 и Python3. В целом скрипты работают, hello world пишется и всё в порядке. Права у всех файлов нормальные, все скрипты под www-data и разрешением 755. Скриптом не обрабатываются формы, выводится пустая страница. При запуске этого же скрипта для обработки форм из консоли

python3 form.py TEXT_1=hello\&TEXT_2=world выводится то, что нужно. При запуске тестового python-сервера командой "python3 -m http.server --cgi" и подключении на localhost:8000 скрипт так же прекрасно обрабатывает форму. Через lighttpd не работает.

Пытался добавить отладочный вывод через
import cgitb
cgitb.enable()
получаю пустую страницу без traceback, если пытаюсь писать в лог
import cgitb
cgitb.enable(display=0, logdir="/tmp")
то получаю на странице сообщение
A problem occurred in a Python script.

Tried to save traceback to /tmp/tmpt6hllcrt.html, but failed.
при этом файл  /tmp/tmpt6hllcrt.html создаётся, но он пустой.

Исходники проблемных страницы и скрипта: ShowHide


Код .html-страницы c формой:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Обработка данных форм</title>
</head>
<body>
    <form action="/web/cgi-bin/form.py">
        <input type="text" name="TEXT_1">
        <input type="text" name="TEXT_2">
        <input type="submit">
    </form>
</body>
</html>


Код скрипта на Python3:
Код: (python) [Выделить]
#!/usr/bin/python3
import cgi
import html
import cgitb
cgitb.enable(display=0, logdir="/tmp")

form = cgi.FieldStorage()
text1 = form.getfirst("TEXT_1", "shit")
text2 = form.getfirst("TEXT_2", "shit")
text1 = html.escape(text1)
text2 = html.escape(text2)

print("Content-type: text/html\n")

print("<!DOCTYPE HTML> <html> <head> <meta charset=\"utf-8\"> <title>Обработка данных форм</title> </head> <body>")
print("<h1>Обработка данных форм!</h1>")

print("<p>TEXT_1: {}</p>".format(text1))
print("<p>TEXT_2: {}</p>".format(text2))

print("</body> </html>")



Конфигурация cgi для lighttpd:
server.modules += ( "mod_cgi" )

$HTTP["url"] =~ "^/web/cgi-bin" {
        cgi.assign = ( ".py" => "/usr/bin/python3" )
}

Пример скрипта, который отлично работает и печатает что надо: ShowHide

Код: (python) [Выделить]
#!/usr/bin/python3

print( "Content-Type: text/html\n\n" )
print( '<html><head><meta content="text/html; charset=UTF-8" />' )
print( '<title>Raspberry Pi</title><p>' )
for count in range(1,100):
  print( 'Hello&nbsp;World... ' )
print( "</p></body></html>" )
« Последнее редактирование: 26 Июнь 2015, 19:22:41 от agentgoblin »
 

Оффлайн ihammers

  • Главный модератор
  • Ветеран
  • *****
  • Сообщений: 1742
  • Debian GNU/Linux Stretch
    • Алтайская Группа Пользователей Linux
  • Jabber: ihammers@jabber.ru
Фрейм, не фрейм, а попытаться стоит повысить уровень логирования в Lighttpd.
Обратите внимание на 5-тый пункт lightttpd-python.
Debian GNU/Linux Stretch, kernel 4.9.0-5-amd64,
LXQt/KDE/OpenBox AMD Phenon X4 / 16Gb RAM / ATI HD7750 Silent
_______________________________
Debian GNU/Linux Stretch, kernel 4.9.0-5-amd64, LXQt/KDE/OpenBox
Acer Aspire One 722 AMD C60 / 4Gb RAM / ATI HD6290
 
Пользователи, которые поблагодарили этот пост: agentgoblin

Оффлайн agentgoblin

  • Активный пользователь
  • **
  • Topic Author
  • Сообщений: 50
Огромное спасибо, добавил, как по ссылке, опцию в конфиг lighttpd
server.breakagelog = "/var/log/lighttpd/breakage.log"и сразу нашёл проблему:
Цитировать
Traceback (most recent call last):
  File "/var/www/web/cgi-bin/form.py", line 15, in <module>
    print("<!DOCTYPE HTML> <html> <head> <meta charset=\"utf-8\"> <title>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0444\u043e\u0440\u043c</title> </head> <body>")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 60-68: ordinal not in range(128)

 Суть ошибки описана тут:
Копипаста с ru.stackoverflow.com: ShowHide
Цитировать
Питон использует кодировку терминала для печати, которая не имеет никакого отношения к sys.getdefaultencoding().

Иногда переменные окружения, определяющие язык, такие как LANGUAGE, LC_ALL,LC_CTYPE, LANG могут быть не установлены, например, в окружении используемом ssh, upstart, Salt, mod_wsgi, crontab, etc. В этом случае используется C (POSIX) локаль, которая использует ascii кодировку, что приводит к UnicodeEncodeError ошибке, т.к. русские буквы не представимы в ascii.

<...>

Ошибка в вопросе связана с Питон багом: Python 3 raises Unicode errors with the C locale (http://bugs.python.org/issue19846). Разработчики решили следовать ascii кодировке из C локали, даже если это ошибка в подавляющем большинстве случаев.

Чтобы временно изменить используемую кодировку можно определить PYTHONIOENCODING:

$ PYTHONIOENCODING=utf-8 python your-script.py

В качестве более постоянного решения, нужно убедится что используется utf-8 локаль в окружении, которое запускает python. Не обязательно русскую локаль устанавливать, чтобы напечатать русский текст. В этом достоинство Юникода, что можно работать с многими языками одновременно. Например, существует C.UTF-8 локаль.


<drama deleted>

Cообщение объединено 26 Июнь 2015, 18:51:17
Победил. Кусок конфига /etc/lighttpd/lighttpd.conf:

server.modules += (
        "mod_setenv"
)

setenv.add-environment = ( "LANG" => env.LANG )

У кого системная локаль не UTF-8, вместо env.LANG так и укажите "UTF-8".

Всем спасибо за поддержку.
« Последнее редактирование: 27 Июнь 2015, 03:55:15 от agentgoblin »
 


Теги:
 

Python

Автор Mongor

Ответов: 4
Просмотров: 765
Последний ответ 24 Сентябрь 2019, 21:15:50
от Olej
[Решено] Matlab программирование и RS-232 port

Автор Fang

Ответов: 0
Просмотров: 1547
Последний ответ 02 Август 2013, 14:11:40
от Fang
Интерпретатор Python

Автор Vitek

Ответов: 2
Просмотров: 1828
Последний ответ 21 Ноябрь 2012, 06:38:19
от Malaheenee
[Решено] Кириллица из MySQL не отображается в браузере.

Автор Purcell

Ответов: 0
Просмотров: 2921
Последний ответ 23 Ноябрь 2013, 02:02:54
от Purcell
вопрос про php, получение переменной из ответа "сервиса" [РЕШЕНО]

Автор zCirill

Ответов: 5
Просмотров: 1852
Последний ответ 03 Июль 2014, 23:58:36
от zCirill