Форум сайта python.su
В интернете полно примеров как на Питоне подключиться к базе, а как результаты запроса вывести в html через CGI, например? Помогите с примером, пожалуйста.
Офлайн
Сделай функцию, которая возвращает строки html-страницы, а потом в CGI-скрипте просто вызови её и выведи строки по очереди.
Вот текст страницы целиком
>>> def get_page(text): ... out = """\ ... <html> ... <body> ... <p>{0}</p> ... </body> ... </html> ... """.format(text) ... return out ... >>> print(get_page('Hello, world!'), end='') <html> <body> <p>Hello, world!</p> </body> </html> >>>
Отредактировано py.user.next (Апрель 8, 2017 16:23:35)
Офлайн
Попытался вывести значение из таблицы, в консоли оно подставляется, а в браузере почему-то нет, в исходнике html обрывается на теге <body>, почему так?
import sqlite3
conn = sqlite3.connect('my.db')
c = conn.cursor()
def selpad():
c.execute('SELECT * FROM pad where id=1')
row = c.fetchone()
while row is not None:
print("id:"+str(row[0]))
out = ("id:"+str(row[0]))
row = c.fetchone()
return out
print("Content-type: text/html")
print()
print ('<html>')
print ('<head>')
print ('<title>Hello Word - First CGI Program</title>')
print ('</head>')
print ('<body>')
print("<h2>Entered Text Content is %s</h2>" % selpad())
print ('<body>')
print ('</html>')
c.close()
conn.close()
Офлайн
AnshlagНеправильный html-код, тег body не закрыт.print ('<html>')
print ('<head>')
print ('<title>Hello Word - First CGI Program</title>')
print ('</head>')
print ('<body>')
print("<h2>Entered Text Content is %s</h2>" % selpad())
print ('<body>')
print ('</html>')
Офлайн
Сейчас вообще пустая страница. Если убрать запрос к базе, а оставить только out='1', то на странице отображается строка, а если с базой, то отрабатывает только в консоли
import cgi, cgitb, sqlite3
conn = sqlite3.connect('my.db')
c = conn.cursor()
def selpad():
c.execute('SELECT * FROM pad where id=1')
row = c.fetchone()
while row is not None:
# print("id:"+str(row[0])+" Наименование: "+str(row[1]) +" | Цена: "+str(row[2]) +" | Кол-во: "+str(row[3]) +" | Дата: "+str(row[4]))
row = c.fetchone()
out = '1'
return out
test = (selpad())
print("Content-type: text/html")
print()
print ('<html>')
print ('<head>')
print ('<title>Hello Word - First CGI Program</title>')
print ('</head>')
print ('<body>')
print("<h2>Entered Text Content is %s</h2>" % test)
print ('</body>')
print ('</html>')
Офлайн
AnshlagНужно убедиться, что сервер имеет доступ к файлу базы и может её открывать.
а если с базой, то отрабатывает только в консоли
Офлайн
В консоли то открывает, вот вывод:
Content-type: text/html
<html>
<head>
<title>Hello Word - First CGI Program</title>
</head>
<body>
<h2>Entered Text Content is 1</h2>
</body>
</html>
>>>
Офлайн
Если закомментировать обращение к базе, то работает и в браузере, а с базой - нет
import cgi, cgitb, sqlite3
conn = sqlite3.connect('my.db')
c = conn.cursor()
def selpad():
# c.execute('SELECT id FROM pad where id=1')
# row = c.fetchone()
# while row is not None:
# print("id:"+str(row[0])+" Наименование: "+str(row[1]) +" | Цена: "+str(row[2]) +" | Кол-во: "+str(row[3]) +" | Дата: "+str(row[4]))
# row = c.fetchone()
out = '1'
return out
test = selpad()
print("Content-type: text/html")
print()
print ('<html>')
print ('<head>')
print ('<title>Hello Word - First CGI Program</title>')
print ('</head>')
print ('<body>')
print("<h2>Entered Text Content is %s</h2>" % test)
print ('</body>')
print ('</html>')
Офлайн
AnshlagКто открывает? Сервер имеется в виду не комп, а программа на компе, в которой выполняется cgi-скрипт. Она обычно выполняется под другим пользователем и может не иметь доступа к скрипту (к директории или на файле права могут быть неправильные). Также файл, который используется скриптом, нужно тоже проверять на доступ.
В консоли то открывает, вот вывод:
sudo -u имя_пользователя_сервера путь/script.py
Отредактировано py.user.next (Апрель 13, 2017 11:14:50)
Офлайн
py.user.next
from http.server import HTTPServer, CGIHTTPRequestHandler
server_address = ("", 8080)
httpd = HTTPServer(server_address, CGIHTTPRequestHandler)
httpd.serve_forever()
Офлайн