Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 8, 2017 15:51:32

Anshlag
Зарегистрирован: 2017-04-08
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Просмотр базы

В интернете полно примеров как на Питоне подключиться к базе, а как результаты запроса вывести в html через CGI, например? Помогите с примером, пожалуйста.

Офлайн

#2 Апрель 8, 2017 16:22:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

Просмотр базы

Сделай функцию, которая возвращает строки 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)

Офлайн

#3 Апрель 13, 2017 07:49:01

Anshlag
Зарегистрирован: 2017-04-08
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Просмотр базы

Попытался вывести значение из таблицы, в консоли оно подставляется, а в браузере почему-то нет, в исходнике 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()

Офлайн

#4 Апрель 13, 2017 09:45:36

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

Просмотр базы

Anshlag
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>')
Неправильный html-код, тег body не закрыт.



Офлайн

#5 Апрель 13, 2017 10:02:12

Anshlag
Зарегистрирован: 2017-04-08
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Просмотр базы

Сейчас вообще пустая страница. Если убрать запрос к базе, а оставить только 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>')

Офлайн

#6 Апрель 13, 2017 10:56:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

Просмотр базы

Anshlag
а если с базой, то отрабатывает только в консоли
Нужно убедиться, что сервер имеет доступ к файлу базы и может её открывать.



Офлайн

#7 Апрель 13, 2017 10:58:24

Anshlag
Зарегистрирован: 2017-04-08
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Просмотр базы

В консоли то открывает, вот вывод:

Content-type: text/html

<html>
<head>
<title>Hello Word - First CGI Program</title>
</head>
<body>
<h2>Entered Text Content is 1</h2>
</body>
</html>
>>>

Офлайн

#8 Апрель 13, 2017 11:01:14

Anshlag
Зарегистрирован: 2017-04-08
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Просмотр базы

Если закомментировать обращение к базе, то работает и в браузере, а с базой - нет

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>')

Офлайн

#9 Апрель 13, 2017 11:11:19

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

Просмотр базы

Anshlag
В консоли то открывает, вот вывод:
Кто открывает? Сервер имеется в виду не комп, а программа на компе, в которой выполняется cgi-скрипт. Она обычно выполняется под другим пользователем и может не иметь доступа к скрипту (к директории или на файле права могут быть неправильные). Также файл, который используется скриптом, нужно тоже проверять на доступ.

Чтобы проверить доступ, надо посмотреть это всё или использовать
sudo -u имя_пользователя_сервера путь/script.py

Ещё логи сервера есть, где тоже пишется информация, если есть какая-то ошибка.



Отредактировано py.user.next (Апрель 13, 2017 11:14:50)

Офлайн

#10 Апрель 13, 2017 11:18:28

Anshlag
Зарегистрирован: 2017-04-08
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Просмотр базы

py.user.next

У меня винда, сервер питоновский на том же компе, запускается таким скриптом

from http.server import HTTPServer, CGIHTTPRequestHandler
server_address = ("", 8080)
httpd = HTTPServer(server_address, CGIHTTPRequestHandler)
httpd.serve_forever()

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version