Найти - Пользователи
Полная версия: Запись формы в файл
Начало » Python для новичков » Запись формы в файл
1 2 3 4
ulfur
truporez, открыл add.cgi в mcedit, смеси табов и пробелов нет (пробелами разделены операторы print и их аргументы, табы только внутри кавычек). Также открыл его в Notepad++ (под виндой), там включено отображение всех символов, включая отступы, переносы строки и прочие спецсимволы - переносы строки юниксовые, пробелы и табы не комбинируются. Сам скрипт add.cgi только генерирует страницу с формой для ввода данных, обработкой занимается write.cgi.
Код add.cgi
#!/usr/bin/python
#-*- coding:utf-8 -*-
import cgi
print 'Content-Type: text/html; charset=utf-8'
print ''
print '<html>'
print ''
print '	<head>'
print ''
print '		<style type="text/css" media="all">'
print ''
print '			@import url(/files/stylesheet/style.css)'
print ''
print '		</style>'
print ''
print '		<title>Добавление записи</title>'
print '	</head>'
print ''
print '	<body>'
print ''
print '		<div id=header>'
print ''
print '			<h1>Телефонная книга</h1>'
print ''
print '		</div>'
print ''
print '		<hr>'
print ''
print '		<div id=main>'
print ''
print '			<script type="application/javascript" src="/files/js/backToMainPageHandler.js">'
print '			</script>'
print ''
print '			<form action="write.cgi" method="post">'
print ''
print '				<table align = center cellspacing=0 width="35%">'
print ''
print '					<caption><h4>Добавление новой записи в телефонную книгу</h4></caption>'
print ''
print '					<tr>'
print ''
print '						<td><span class="first_column_of_table">Фамилия</span></td>'
print '						<td><textarea rows=1 cols=50 required name="surname"></textarea></td>'
print ''
print '					</tr>'
print ''
print '					<tr>'
print ''
print '						<td><span class="first_column_of_table">Имя</span></td>'
print '						<td><textarea rows=1 cols=50 required name="firstname"></textarea></td>'
print ''
print '					</tr>'
print ''
print '					<tr>'
print ''
print '						<td><span class="first_column_of_table">Отчество</span></td>'
print '						<td><textarea rows=1 cols=50 required name="patronymic"></textarea></td>'
print ''
print '					</tr>'
print ''
print '					<tr>'
print ''
print '						<td><span class="first_column_of_table">Адрес</span></td>'
print '						<td><textarea rows=1 cols=50 required name="address"></textarea></td>'
print ''
print '					<tr>'
print ''
print '						<td><span class="first_column_of_table">Телефон</span></td>'
print '						<td><textarea rows=1 cols=50 required name="phonenum"></textarea></td>'
print ''
print '					</tr>'
print ''
print '						<td><input type="submit" value="Добавить"></td>'
print '						<td>'
print '							<input type="reset" value="Очистить">'
print '							<input type="button" value="На главную" id="backToMainPage">'
print '						</td>'
print ''
print '					<tr>'
print ''
print '				</table>'
print ''
print '			</form>'
print ''
print '			<script type="application/javascript" src="/files/js/backToMainPage.js">'
print '			</script>'
print ''
print '		</div>'
print ''
print '		<hr>'
print ''
print '		<div id=footer>'
print ''
print '			<a href="mailto:terminator@docsis.ru?subject=Вопрос или предложение по работе ресурса">Обратная связь</a>'
print ''
print '		</div>'
print ''
print '	</body>'
print ''
print '</html>'
Скрин с mcedit прицепил.
ulfur
Скрин с Notepad++.
truporez
Красивый скриншот, эпохальный. Вы никогда не слышали о такой вещи как тройные кавычки?
Разберитесь, однако, с отступами по всем своим файлам. Сидеть с вами над каждой строкой у меня желания нет.
ulfur
truporez
Вы никогда не слышали о такой вещи как тройные кавычки?
Ну так Python начал изучать недавно. Если я правильно понял, можно несколько print'ов заменить одним с тройными кавычками.
Попробовал (отредактировал оба скрипта, и вызывающий, и вызываемый). Радует то, что сократилось количество print'ов, но поведение скриптов не изменилось - вызывающий отправляет форму, вызываемый её обрабатывает, но никуда не пишет).
add.cgi
#!/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
#!/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>
""")
ulfur
Еще раз спасибо FishHook, DomainLider и truporez за участие в обсуждении и помощь. Источником проблем с записью был SELinux, который в RFRemix 17 (возможно, и в оригинальной Fedora 17) включен по умолчанию, т.е. проблема была не в коде. Дело в том, что по умолчанию SELinux запрещает демону httpd (т.е. апачу) производить запись в файлы (см. selinux.txt). Поэтому SELinux необходимо либо правильно настроить, либо отключить совсем, дабы не мешал. Если кто столкнется с такой же проблемой, вот решения:
  1. Настройка. В консоли вводим следующую последовательность команд (пути и имена могут отличаться):
    sudo su
    semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/files/txt/phonebook.dat'
    restorecon -v '/var/www/html/files/txt/phonebook.dat'
    setsebool -P httpd_unified 1
    reboot -f
    
    Система перезагрузится и запись в файл заработает.
  2. Отключение SELinux. Способы отключения см. здесь
ulfur
Поправка к предыдущему моему посту: в новых версиях Fedora/RFRemix (19.x/20.x) создание правил для апача может не работать (видимо, SELinux доработали, либо наоборот, добавили багов). Кроме того, новые версии SELinux конфликтуют с другими приложениями (например, Wine). Так что если на Вашем сервере установлена Fedora/RFRemix/CentOS/RHEL/Scientific Linux/другой дистр семейства Red Hat, Вам не нужны проблемы и у Вас есть права root - лучше отключить SELinux от греха подальше. Как - см. по ссылке в предыдущем посте.
yurik
народ, сегодня первый раз отрыл книгу по python (AByteofPython) и пытаюсь действовать по инструкциям: изменить функцию Path на компе, скачать сам Python, установить редактор, написать первую программу (Hello World) и запустить её. НО, почти ничего из этого не хочет получаться, хотя всё делаю так, как написано - из коммандной строки python не запускается + редактор не выполняет программу. скрины ниже.
буду очень признателен если объясните что я делаю не так ( на всякий случай винда стоит 8)
yurik
ещё один
Budulianin
yurik
ещё один

Ты запросил версию Python и получил её. Введи без параметров - python. Запустится интерактивная оболочка. Для исполнения кода из файлов - python путь_до_файла_с_кодом
FishHook
yurik,
и при чем тут этот топик? У его автора вроде нет проблем с установкой питона.
Вы что, не понимаете принципа устройства форума? Не понимаете, зачем нужны разделы, подразделы, подподподразделы, как их не называй?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB