Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/37: Рейтинг темы: голосов - 37, средняя оценка - 4.86
18 / 18 / 1
Регистрация: 22.11.2012
Сообщений: 62
1

Запись формы в файл CGI скриптом на Python

12.01.2013, 11:48. Просмотров 6984. Ответов 23
Метки нет (Все метки)

Доброго всем времени суток! Мне необходимо сохранить содержимое формы в файл, используя CGI скрипты на языке Python. Данные отправляются методом POST. Проблема в том, что форма благополучно обрабатывается (содержимое полей формы объединяется в одну строку и сохраняется в переменную info), но в файл не сохраняется (сам файл предварительно создан, владелец и группа файла apache, доступ: хозяин rwx, группа rwx, другие rwx, для каталога, в котором хранится файл (/var/www/html/files/txt/) хозяин, группа и права доступа выставлены такие же). Для CGI скриптов права доступа такие: хозяин и группа root, доступ: хозяин rwx, группа r-x, другие r-x. Пробовал запустить обычный скрипт на Python (не CGI), работающий в интерактивном режиме и производящий запись в тот файл, в который должен сохранять данные CGI от имени пользователя apache (т.к. от имени этого пользователя работает веб-сервер)
Запись формы в файл CGI скриптом на Python

- все сохраняется, но мне необходимо реализовать именно веб-интерфейс (данные вводятся в форму, обрабатываются CGI и записываются в файл).
Обработка формы:
Python
1
2
3
4
5
6
surname = cgi.escape(form['surname'].value)
firstname = cgi.escape(form['firstname'].value)
patronymic =  cgi.escape(form['patronymic'].value)
address = cgi.escape(form['address'].value)
phone = cgi.escape(form['phonenum'].value)
info = surname + ' ' + firstname + ' ' + patronymic + ' ' + address + ' ' + phone
Вначале пробовал записывать в файл так:
Python
1
2
3
4
f = open ('/files/txt/phonebook.dat', 'a')
# путь указан от корня документа (Document Root) /var/www/html/
f.writelines (info)
f.close()
Запись в файл не происходит. Попробовал заменить путь к файлу на полный (относительно корня файловой системы):
Python
1
f = open ('/var/www/html/files/txt/phonebook.dat', 'a')
- история повторяется. Заменил a на a+:
Python
1
f = open ('/var/www/html/files/txt/phonebook.dat', 'a+')
- все равно не пишет. Предполагал, что дело в некорректной обработке формы, но при замене записи в файл выводом на страницу:
Python
1
print '<p>'+info+'</p>'
скрипт нормально работает (на странице я получаю значения полей формы, разделенные пробелами, т.е. обработка формы работает корректно), но мне необходимо сохранить полученную информацию в файл. Версия Python: 2.7.3. Веб-сервер: Apache 2.2.22. ОС: Russian Fedora Remix 17.1 x86_64.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2013, 11:48
Ответы с готовыми решениями:

Запись кириллицы в БД CGI-скриптом на C++
Задача такая: CGI-скрипт расположенный на сайте получает через GET параметры на русском языке....

CGI на Python открывается в браузере как текстовый файл
Проблема в теме, помогите

При попытке отправить данные формы открывается страница с сообщением: 'The requested method POST is not allowed for the URL /cgi-bin/script.cgi.'
Имеется форма, начальный тег: &lt;form method=post action='cgi-bin/script.cgi'&gt; При попытке...

не запускаеться (CGI вместе с MySQL) под Apache: Premature end of script headers: c:/www/cgi-bin/catalog.cgi
такая трабла: вот что пишет Apache в Log: Premature end of script headers:...

23
18 / 18 / 1
Регистрация: 22.11.2012
Сообщений: 62
12.01.2013, 11:55  [ТС] 2
Где может быть ошибка?
0
4851 / 3272 / 466
Регистрация: 10.12.2008
Сообщений: 10,570
12.01.2013, 14:06 3
запиши сначала всё в /tmp/file.txt
1
18 / 18 / 1
Регистрация: 22.11.2012
Сообщений: 62
12.01.2013, 14:24  [ТС] 4
accept, сделал, как Вы посоветовали и получил такой результат: скрипт сообщает, что запись успешно добавлена, но файл /tmp/file.txt пуст. Если можете проконсультировать дальше, выложу исходник.
0
4851 / 3272 / 466
Регистрация: 10.12.2008
Сообщений: 10,570
13.01.2013, 00:44 5
Цитата Сообщение от ulfur Посмотреть сообщение
Python
1
f.writelines (info)
Python
1
print >>f, info
Добавлено через 2 минуты
полный скрипт скопируй сюда
1
18 / 18 / 1
Регистрация: 22.11.2012
Сообщений: 62
13.01.2013, 09:01  [ТС] 6
accept, спасибо за ответ! Полный скрипт отправил в личку.
0
4851 / 3272 / 466
Регистрация: 10.12.2008
Сообщений: 10,570
13.01.2013, 12:27 7
Цитата Сообщение от ulfur Посмотреть сообщение
Полный скрипт отправил в личку.
не надо в личку, копируй сюда
1
18 / 18 / 1
Регистрация: 22.11.2012
Сообщений: 62
13.01.2013, 18:02  [ТС] 8
accept, скрипты несколько модифицировал, но по-прежнему вызывающий отправляет форму, вызываемый её обрабатывает, но никуда не пишет.
Вызывающий скрипт add.cgi (генерирует форму и отправляет её методом POST):
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/usr/bin/python
#-*- coding:utf-8 -*-
 
import cgi
 
print('Content-Type: text/html; charset=utf-8\n')
print("""
<html>
 
    <head>
 
        <style type="text/css" media="all">
 
            @import url(/files/stylesheet/style.css)
 
        </style>
 
        <title>Добавление записи</title>
    </head>
 
    <body>
 
        <div id=header>
 
            <h1>Телефонная книга</h1>
 
        </div>
 
        <hr>
 
        <div id=main>
 
            <script type="application/javascript" src="/files/js/backToMainPageHandler.js">
            </script>
 
            <form action="write.cgi" method="post">
 
                <table align = center cellspacing=0 width="35%">
 
                    <caption><h4>Добавление новой записи в телефонную книгу</h4></caption>
 
                    <tr>
 
                        <td><span class="first_column_of_table">Фамилия</span></td>
                        <td><textarea rows=1 cols=50 required name="surname"></textarea></td>
 
                    </tr>
 
                    <tr>
 
                        <td><span class="first_column_of_table">Имя</span></td>
                        <td><textarea rows=1 cols=50 required name="firstname"></textarea></td>
 
                    </tr>
 
                    <tr>
 
                        <td><span class="first_column_of_table">Отчество</span></td>
                        <td><textarea rows=1 cols=50 required name="patronymic"></textarea></td>
 
                    </tr>
 
                    <tr>
 
                        <td><span class="first_column_of_table">Адрес</span></td>
                        <td><textarea rows=1 cols=50 required name="address"></textarea></td>
 
                    <tr>
 
                        <td><span class="first_column_of_table">Телефон</span></td>
                        <td><textarea rows=1 cols=50 required name="phonenum"></textarea></td>
 
                    </tr>
 
                        <td><input type="submit" value="Добавить"></td>
                        <td>
                            <input type="reset" value="Очистить">
                            <input type="button" value="На главную" id="backToMainPage">
                        </td>
 
                    <tr>
 
                </table>
 
            </form>
 
            <script type="application/javascript" src="/files/js/backToMainPage.js">
            </script>
 
        </div>
 
        <hr>
 
        <div id=footer>
 
            <a href="mailto:terminator@docsis.ru?subject=Вопрос или предложение по работе ресурса">Обратная связь</a>
 
        </div>
 
    </body>
 
</html>
""")
Вызываемый скрипт write.cgi (обрабатывает форму и пишет результат в файл):
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/python
#-*- coding:utf-8 -*-
 
import cgi
form = cgi.FieldStorage()
 
print('Content-Type: text/html; charset=utf-8\n')
print("""
<html>
 
    <head>
 
        <style type="text/css">
 
            body
            {
                background-color: #FFFAE1;
            }
 
        </style>
 
    </head>
 
    <body>
""")
if ('surname' and 'firstname' and 'patronymic' and 'address' and 'phonenum') in form:
    surname = cgi.escape(form['surname'].value)
    firstname = cgi.escape(form['firstname'].value)
    patronymic =  cgi.escape(form['patronymic'].value)
    address = cgi.escape(form['address'].value)
    phone = cgi.escape(form['phonenum'].value)
    info = surname + ' ' + firstname + ' ' + patronymic + ' ' + address + ' ' + phone
    try:
        f = open ('/tmp/phonebook.dat', 'a+')
        f.writelines (info)
        f.close ()
        print("""
                <script type="application/javascript" src="/files/js/continueToAdd.js">
                </script>
        """)
    except IOError:
        print("""
                <script type="application/javascript" src="/files/js/failedToAccessFile.js">
                </script>
        """)
print("""
    </body>
</html>
""")
Добавлено через 4 часа 44 минуты
Цитата Сообщение от accept Посмотреть сообщение
Python
1
print >>f, info
Попробовал, результат тот же.
0
4851 / 3272 / 466
Регистрация: 10.12.2008
Сообщений: 10,570
14.01.2013, 03:48 9
вот отлаженный
1
Вложения
Тип файла: zip post.zip (1.0 Кб, 23 просмотров)
18 / 18 / 1
Регистрация: 22.11.2012
Сообщений: 62
14.01.2013, 06:21  [ТС] 10
accept, спасибо за ответ! Попробовал отлаженный вариант, данные отправляются, но файл /tmp/phonebook.dat при этом остается пустым.
0
4851 / 3272 / 466
Регистрация: 10.12.2008
Сообщений: 10,570
14.01.2013, 06:44 11
Цитата Сообщение от ulfur Посмотреть сообщение
но файл /tmp/phonebook.dat при этом остается пустым
сотри его в /tmp и попробуй снова
у меня всё пишет
1
4851 / 3272 / 466
Регистрация: 10.12.2008
Сообщений: 10,570
14.01.2013, 07:41 12
добавил косметических изменений
1
Вложения
Тип файла: zip post.zip (1.0 Кб, 9 просмотров)
18 / 18 / 1
Регистрация: 22.11.2012
Сообщений: 62
14.01.2013, 21:01  [ТС] 13
Цитата Сообщение от accept Посмотреть сообщение
у меня всё пишет
accept, будьте добры, напишите, какие у Вас ОС, веб-сервер и версия Python? У меня Russian Fedora Remix 17.1 (x86_64), Apache 2.2.22, Python 2.7.3. Пробую разные варианты - скрипт так и не производит запись в файл.
0
4851 / 3272 / 466
Регистрация: 10.12.2008
Сообщений: 10,570
15.01.2013, 02:12 14
Цитата Сообщение от ulfur Посмотреть сообщение
Пробую разные варианты - скрипт так и не производит запись в файл.
проверил ещё твою форму из скрипта (добавил её в архив)

1. положи скрипты в папку cgi-bin
2. убедись, что нет файла /tmp/phonebook.dat
3. открой страницу, введи любые значения, нажми ок
4. выполни cat /tmp/phonebook.dat

если файл создался, но внутри ничего нет, то надо сделать тестовый скрипт, который будет, находясь в папке cgi-bin, выполнять простую запись в файл в /tmp/file.txt, и заниматься им без всякой формы

это не от версий проблема, а от настроек
1
Вложения
Тип файла: zip post.zip (2.0 Кб, 9 просмотров)
18 / 18 / 1
Регистрация: 22.11.2012
Сообщений: 62
15.01.2013, 06:57  [ТС] 15
accept, огромное спасибо за ответ!
Цитата Сообщение от accept Посмотреть сообщение
положи скрипты в папку cgi-bin
Положил (собственно, туда я изначально и помещал все CGI-скрипты)
Цитата Сообщение от accept Посмотреть сообщение
убедись, что нет файла /tmp/phonebook.dat
Специально удалил его перед запуском.
Цитата Сообщение от accept Посмотреть сообщение
открой страницу, введи любые значения, нажми ок
Выполнил.
Цитата Сообщение от accept Посмотреть сообщение
выполни cat /tmp/phonebook.dat
Запись формы в файл CGI скриптом на Python

Цитата Сообщение от accept Посмотреть сообщение
если файл создался, но внутри ничего нет, то надо сделать тестовый скрипт, который будет, находясь в папке cgi-bin, выполнять простую запись в файл
Хотя файл и не создался, все-таки сделал тестовый скрипт и запустил его от имени apache:
Запись формы в файл CGI скриптом на Python

Код скрипта:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/python
#-*- coding:utf-8 -*-
 
continueAddition = True
 
while continueAddition == True:
    surname = input ('Введите фамилию: ')
    firstname = input ('Введите имя: ')
    patronymic = input ('Введите отчество: ')
    address = input ('Введите адрес: ')
    phone = input('Введите телефон: ')
    info = str(surname+' '+firstname+' '+patronymic+' '+address+' '+phone)
    isCorrectAnswer = False
    while isCorrectAnswer == False:
    continueAdd = str ( input('Продолжить добавление [Y/N]? ') )
    if continueAdd == 'Y' or continueAdd == 'y':
        isCorrectAnswer = True
        continueAddition = True
        elif continueAdd == 'N' or continueAdd == 'n':
        dbfile = open ('/tmp/phonebook.txt', 'a+')
        dbfile.write(info)
        dbfile.close()
        isCorrectAnswer = True
        continueAddition = False
    else:
        print ('Введен некорректный ответ. Введите Y или y, чтобы продолжить, или N или n, чтобы продолжить.')
        continue
Цитата Сообщение от accept Посмотреть сообщение
это не от версий проблема, а от настроек
Настройки апача не трогал (т.е. они стандартные). Архив с настройками прицепил во вложении.
httpd.7z
0
18 / 18 / 1
Регистрация: 22.11.2012
Сообщений: 62
15.01.2013, 07:04  [ТС] 16
Закинул скрипт сюда - форматирование кода слетело... Прицепил архив со скриптом во вложении.
adddata.7z
1
4851 / 3272 / 466
Регистрация: 10.12.2008
Сообщений: 10,570
15.01.2013, 08:36 17
Цитата Сообщение от ulfur Посмотреть сообщение
Хотя файл и не создался, все-таки сделал тестовый скрипт и запустил его от имени apache:
его надо запустить через браузер
1
4851 / 3272 / 466
Регистрация: 10.12.2008
Сообщений: 10,570
15.01.2013, 08:43 18
добавил скрипт для тестирования
(не надо мешать всё воедино)
1
Вложения
Тип файла: zip page.zip (2.3 Кб, 6 просмотров)
4851 / 3272 / 466
Регистрация: 10.12.2008
Сообщений: 10,570
15.01.2013, 08:45 19
Цитата Сообщение от ulfur Посмотреть сообщение
Специально удалил его перед запуском.
Цитата Сообщение от ulfur Посмотреть сообщение
Хотя файл и не создался
так не создался файл ?

1. тестовый скрипт положи в cgi-bin
2. запусти его через браузер
3. выполни cat /tmp/file.txt
1
18 / 18 / 1
Регистрация: 22.11.2012
Сообщений: 62
15.01.2013, 14:45  [ТС] 20
Цитата Сообщение от accept Посмотреть сообщение
1. тестовый скрипт положи в cgi-bin
2. запусти его через браузер
3. выполни cat /tmp/file.txt
Результат:
Запись формы в файл CGI скриптом на Python


Запись формы в файл CGI скриптом на Python
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2013, 14:45

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Не работает запись в файл python 3.6
помогите разобраться, не записывает в файл данные #создаём текстовый файл и добавляем в него...

Python. CGI и COOKIE
На досуге читал блоги КиберПса и при выполнении примеров с сgi-скриптами возникла ошибка. ...

Cgi скрипт python
Сперва объясню проблему и ситуацию. Пишу на python клиент серверное приложение (почта). Реализовав...

CGI в Python на Mac
Хотел использовать cgi в проекте на python. Возникает такая проблема на Mac. Этот же проект...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.