Передача строки из формы в html-файле в python-скрипт с соблюдением кодировки utf-8 - PullRequest
2 голосов
/ 02 марта 2011

У меня есть эта форма в файле index.html.

<form method="post" action="index.php" accept-charset="UTF-8">
    <input id="a" name="a" type="text">
    <input type="submit" name="run_query" value="Add User" size="30">
</form>

И я пытаюсь передать ввод текста в сценарий Pyton в качестве аргумента, вставив следующий код php в файл index.html.:

<?
    session_start();
    ob_start();
    if(isset($_REQUEST['run_query'])) {
    $add_user = $_REQUEST['a'];
    $command = "add_author.py $add_user";
        exec($command); 
    }
?>

Я поместил файл add_author.py в ту же папку, где лежит index.html.Он отлично работает с любой строкой.Но если я попытаюсь использовать строки, содержащие ä ö é, это не сработает.

Файл python выглядит следующим образом.

import sys
import codecs
if __name__ == '__main__':
    wFile = codecs.open("test.txt", "w", "utf8")
    wFile.write(" ".join(sys.argv[1:]))
    wFile.close()

Кстати: в index.html есть эта строкав нем.

<meta charset="utf-8" />

Я хотел бы услышать о лучшем подходе к управлению моей задачей или исправлении моего подхода.Спасибо!

Ответы [ 4 ]

1 голос
/ 02 марта 2011

Почему бы не сделать так, чтобы PHP записывал в файл вместо вызова другого скрипта Python?

if (!$handle = fopen("test.txt", 'a')) {
    echo "Cannot open file ($filename)";
    exit;
}

if (fwrite($handle, $_REQUEST['a']) === FALSE) {
    echo "Cannot write to file ($filename)";
    exit;
}

Если вы настаиваете на использовании скрипта Python, возможно, вам нужно сначала его кодировать, но обычно проверяйте с помощью различных подходов.здесь указано: http://docs.python.org/howto/unicode.html Я предполагаю, что вам просто нужно вызвать unicode () для строки

wFile.write(unicode(sys.argv[1:]))
0 голосов
/ 20 января 2015

Фактическая проблема с кодом PHP заключается в том, что аргумент «$ add_user», добавляемый к «команде», никак не экранируется и не защищается. Это позволяет отправлять что угодно в «exec», делая систему уязвимой для атак. У веб-комикса XKCD есть «забавный» пример этой проблемы: http://xkcd.com/327/

Причина того, что вы видите, заключается в том, что код "UTF-8" в кодировке UTF начинается с непечатаемого байта, который вызывает проблемы во многих старых оболочках, в зависимости от конфигурации системы.

0 голосов
/ 02 марта 2011

Вы можете использовать Python напрямую с CGI.Это должно быть быстрее, чем вызывать Python из PHP.Это тоже должно быть проще в настройке.

Простой пример.

#!/usr/bin/python

import cgi;
import codecs;

form = cgi.FieldStorage()
my_a = form.getvalue("a","")

wFile = codecs.open("test.txt", "w", "utf8")
wFile.write(my_a);
wFile.close()

print("Content-Type: text/plain")
print("Location: ../plain.html")
print()

Вы должны поместить этот файл python в каталог для сценариев CGI.Наиболее распространенным является /cgi-bin/.Ну, серверу тоже может понадобиться некоторая конфигурация.

3 последние строки - это простые http заголовки.В моем примере это просто перенаправление на другой сайт.Нет контента для отображения.getvalue("a","") вернет значение поля "a" или пустой строки (второй аргумент).Ну, почти обычный файл Python.

0 голосов
/ 02 марта 2011
# -*- coding: utf-8 -*-

В верхней части вашего файла должно быть принудительное кодирование UTF.

# -*- coding: utf-8 -*-
import sys

if __name__ in '__main__':
    with open('test.txt','w') as out:
        out.write(''.join(sys.argv[1:]).encode("utf-8"))

Должно работать нормально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...