Найти - Пользователи
Полная версия: создание стартовой страницы на питоне
Начало » Python для новичков » создание стартовой страницы на питоне
1 2 3
Novichek
fata1ex
Вам же пишут, что ошибка при работе с сокетом. А вообще, программист, который при ошибке ‘broken pipe’ начинает работать с шаблонами, вызывает подозрительния )

Попробуйте написать в список рассылки flask или опишите _полностью_ построенную систему. Довольно сложно понять, что у вас там и как. Но думается мне, проблема не во фреймворке.

Жаль, что здесь нельзя изображение вставить..так бы легче всё и нагляднее объяснить можно было…

Откровенно признаюсь я новичёк в этом деле и просто пытюсь создать стартовую страницу по средствам python и фреймворка flask, чтобы используя её можно было отображать результаты запроса в БД, а вдальнейшем заполнять её каким-то образом+введение логов.

Физическая схема представляет собой следующее:
наличие ЛВС, в сотсаве которой имеется:
1 ПЭВМ-под управлением OS Fedora(консольный режим-графики нет)
2 ПЭВМ-под управлением ОС Windows Server 2003
3 ПЭВМ-под управлением ОС Windows Server 2003
4 ПЭВМ-под управлением ОС Windows XP
5 ПЭВМ-под управлением ОС Windows 7

на 2 ПЭВМ иеется-MS SQL Server (там БД-name2BD)
на 3 ПЭВМ иеется-Oracle 11G (там БД-name1BD)

необходимо написать скрипт (hello.py) на питоне, который будет выполнять серверную часть приложения и работать на 1 ПЭВМ.

К данному скрипту можно обратиться посредствам web c любой ПЭВМ ЛВС через браузер (в графич режимах-через браузер,в консольных-через утилиты(например через wget в Fedore))
-соответсвенно обращение к запущенному скрипту может быть двух видов:с локале(в данном случае в ПЭВМ 1) и внешняя.

Я делаю вывод,если заработает в локале-значит должно заработать и с внешке,при условии что есть записть в скрипте,которая разрешает обращаться к нему внешне+debag-информацию выдаёт.

Что я для этого сделал:
Прежде всего почитал про язык python.
Попробовал написать функции для работы с СУБД MS SQL и Oracle 11G. В консольном режиме вывод результатов запросов-всё работает, результат выдаётся в читабильном виде и в читаемой кодировки.

Далее я решил, чтобы этот результат можно было отобразитьчерез web-через бпраузер с любой ПЭВМ рассматриваемой ЛВС.
ЛВС не имеет выхода в интернет. Т.е. всё должно быть автономное.
Чтобы результат был оформлен в виде какой-либо web-страницы и было всё интуитивно понятно+наличие кнопки,по нажатию которой можно было обновить содержание страницы, т.е. заново отобразить результаты запросов в БДым.

Из большого числа известных фреймворков мне больше понравился Flask.

Анг. яз конечно не в совершенстве знаю,но общие фразы вроде понятны.
почитал про Flask вот здесь: http://flask.pocoo.org/docs/

Из вычитанного понял, что чтобы это всё заработало через web необходимо
1)наличие самого скрипта
2)наличие шаблона моей стартовой web-страницы
3)наличие файла стиля оформления style.css например

Для этого я установил Flask.
В ручную создал два каталога:
1)/var/www/html/py/static
2)/var/www/html/py/templates
static содержит файл стилей оформления style.css
templates содержит шаблон стартовой страницы index.html
Директория /var/www/html/py содержит сам скрипт hello.py

Далее, чтобы python мог работать через WEB максимально быстро, для этого необходимо скрипт запускать не как CGI-приложение, а через специальный интрефейс (WSGI) взаимодействия Python c Web-сервером Apache 2.2

Сервер Apache 2.2 уже в системе был установлен.
Т.к. я использую python 2.7, то я установил mod_wsgi модуль.
Прописал в /etc/httpd/conf.d в файле wsgi.conf сл. строку:

 
LoadModule wsgi_module modules/mod_wsgi.so

в основном конфигурационном файле веб-сервера Apache, пож наименованием httpd.conf я добавил сл записи:

...
Include conf.d/*.conf
.....
WSGIScriptAlias /py /var/www/html/py/hello.py

P.S. если нужно могу содержимое файла httpd.conf покзать,но он объёмный…я только ключевые моменты указал.

Я решил,что WSGI настроен, когда я просто написал скрипт с теми же функциями, что выше по работе с СУБД, но лишь только использщуя WSGI (т.е. в скрипте есть функция def application (environ, start_response): -а уже в ней вызывал самописный функции funOracle(), funMSSQL()) и результат запроса отобразился в браузере, но просто не оформленным,а всё просто выдал сервер в одну строчку…поэтому сделал вывод что сам интрефейс взаимодействия python c Apache настроен и работает.

Далее начал писать скрипт с использованием Flask

код скрипта (hello.py):

#!/usr/bin/env python 
#-*-coding: utf-8 
import os,cx_Oracle,pymssql 
import flask 
import unittest 
import tempfile
#Импортируем класс Flask
from flask import Flask
from flask import render_template
DEBAG=True
#Создаём экземпляр app класса Flask. Экземлаяр в данном случае уже является WSGI #приложением
app = Flask(__name__)
#это блок куда записывать функции
@app.route('/index.html', methods=['GET'])
def funOracle():
    connection = cx_Oracle.connect("user","pwd","ip_adrr/name1BD")
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM table where pole=znachenie")
    date=cursor.fetchall()
    p=''
    for rec in date:
       p=p+str(rec)
    connection.close()
    p.decode('string_escape')
    return render_template('index.html',keyone=str(p))
def funMSSQL():
    conn = pymssql.connect( user = 'user', password = 'pwd', host = 'namehost', database = 'name2BD')
    cur=conn.cursor()
    cur.execute('SELECT * FROM table10')
    data=cur.fetchall()
    s=''
    for rec in data:
       s=s+str(rec)
    conn.close()
    return render_template('index.html',keytwo=s)
#этот блок запускает на исполнение наше WSGI приложение, причём так,чтобы клиенты ЛВС #запустить это приложение тоже.
if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')


сохранил его в директории: /var/www/html/py/

далее создал html-страницу-шаблон (index.html):

<!doctype html>
<title> Стартовая страница </title>
<p><h1> Стартовая страница</h1></p>
<table>
<tr>
<th>Ответ на запрос Oracle</th>
</tr>
<tr>
{%  if keyone %}
<th>{{keyone}}</th>
{%  else %}
<th>Результат запроса не передан шаблону в виде ключа keyone</th>
{%  endif %}
</tr>
<tr>
<th>Ответ на запрос MS SQL</th>
</tr>
<tr>
{%  if keytwo %}
<th>{{keytwo}}</th>
{%  else %}
<th>Результат запроса не передан шаблону в виде ключа keytwo</th>
{%  endif %}
</tr>

Как создать кнопку в данном случае-я так и не понял тоже.
сохранил этот файл в директорииvar/www/html/py/templates

Создал css файл (style.css):

body            { font-family: sans-serif; background: #eee; }
a, h1, h2       { color: #377BA8; }
h1, h2          { font-family: 'Georgia', serif; margin: 0; }
h1              { border-bottom: 2px solid #eee; }
h2              { font-size: 1.2em; }
.page           { margin: 2em auto; width: 35em; border: 5px solid #ccc;
                  padding: 0.8em; background: white; }
.entries        { list-style: none; margin: 0; padding: 0; }
.entries li     { margin: 0.8em 1.2em; }
.entries li h2  { margin-left: -1em; }
.add-entry      { font-size: 0.9em; border-bottom: 1px solid #ccc; }
.add-entry dl   { font-weight: bold; }
.metanav        { text-align: right; font-size: 0.8em; padding: 0.3em;
                  margin-bottom: 1em; background: #fafafa; }
.flash          { background: #CEE5F5; padding: 0.5em;
                  border: 1px solid #AACBE2; }
.error          { background: #F0D6D6; padding: 0.5em; }

сохранил его в директории: /var/www/html/py/static

Запустил apache на 1 ПЭВМ:
[root@ser py]#/etc/init.d/httpd start
Starting httpd:              [OK]
[root@ser py]#

Запустил серверную часть приложения в виде скрипта hello.py на 1 ПЭВМ:

[root@ser py]# python hello.py
 * Running on http://0.0.0.0:5000/
 * Restarting with reloader...

после чего (в сл рабочем терминале на ПЭВМ 1 (FEDORA))пытаюсь обратиться с локале (1 ПЭВМ) к данному скрипту

[root@ser py]# wget 'http://127.0.0.1:5000/index.html'
--2012-03-30 19:35:15--  http://127.0.0.1:5000/index.html
Устанавливается соединение с 127.0.0.1:5000... соединение установлено.
Запрос HTTP послан, ожидается ответ... 500 INTERNAL SERVER ERROR
2012-03-30 19:35:20 ОШИБКА 500: INTERNAL SERVER ERROR.
[root@ser py]# 



как видно-пришла ошибка 500((

в это время на серверной части появляются сл строки:

[root@ser py]# python hello.py
 * Running on http://0.0.0.0:5000/
 * Restarting with reloader...
127.0.0.1 - - [30/Mar/2012 19:35:20] "GET /index.html HTTP/1.0" 500 -
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 43539)
Traceback (most recent call last):
  File "/usr/lib/python2.6/SocketServer.py", line 283, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python2.6/SocketServer.py", line 309, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python2.6/SocketServer.py", line 322, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python2.6/SocketServer.py", line 618, in __init__
    self.finish()
  File "/usr/lib/python2.6/SocketServer.py", line 661, in finish
    self.wfile.flush()
  File "/usr/lib/python2.6/socket.py", line 303, in flush
    self._sock.sendall(buffer(data, write_offset, buffer_size))
error: [Errno 32] Broken pipe
----------------------------------------

Как эту ошибку решить-не знаю..вроде же всё работало по отдельности…

Пытаюсь обратиться с браузера ПЭВМ из ЛВС:
url: http://127.0.0.1:5000/index.html
с надеждой,что получу ожидаемый шаблон страницы и заполненная соответсвенно
тоже самое в браузере получаю ошибку 500, а на серверной части никаких даже строк не образовалось новых..видимо то ли с ЛВС обращение не дошло либо сразу же закрылся скрипт по отнощению к запросу из ЛВС…


В краткости вроде всё описал. У кого есть мысли по разрешению данного вопроса?



cutwater
Novichek
В краткости вроде всё описал. У кого есть мысли по разрешению данного вопроса?

В краткости? Да кто в здравом уме будет читать эту простыню.

Я Вам уже говорил что делать, повторю более доступно. Упростить вашу программу до минимально рабочего варианта (благо там кода не так много), заставить работать. Посмотреть на каком этапе это все падает.\

Потому что ваша адская смесь Flask, Oracle, и до кучу Apache с mod_wsgi и простыни шаблонов с CSS что вы постите делают крайне затруднительными поставить диагноз.

P.S. прежде чем делать такую адскую смесь попытались бы поднять hello world на встроенном в Flask сервере для разработки.

А пока что моя плакаль кровавыми слезами.
Novichek
я попробовал просто написать скрипт такого содержания,который просто должен выдать ключ='hello word' в шаблон:
скрипт primer.py

#!/usr/bin/env python 
#-*-coding: utf-8 
import os
import flask 
import unittest 
import tempfile
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/index.html', methods=['GET'])
def fun1:
    p='Hello word!'
    p.decode('string_escape')
    return render_template('index.html',keyone=str(p))
if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

простой шаблон (index.html):

<!doctype html>
<title> Стартовая страница </title>
{%  if keyone %}
<th>{{keyone}}</th>
{%  else %}
<th>Результат запроса не передан шаблону в виде ключа keyone</th>
{%  endif %}
</tr>

запускаю скрипт:

[root@ser py]# python primer.py
 * Running on http://0.0.0.0:5000/
 * Restarting with reloader...

Обращаюсь с локали:

[root@ser py]# wget 'http://127.0.0.1:5000/index.html'
--2012-04-05 10:58:15--  http://127.0.0.1:5000/index.html
Устанавливается соединение с 127.0.0.1:5000... соединение установлено.
Запрос HTTP послан, ожидается ответ... 500 INTERNAL SERVER ERROR
2012-04-05 10:58:17 ОШИБКА 500: INTERNAL SERVER ERROR.
[root@ser py]# 

в это время с серверной части получаю сл debag:
[root@ser py]# python primer.py
 * Running on http://0.0.0.0:5000/
 * Restarting with reloader...
127.0.0.1 - - [05/Apr/2012 10:58:17] "GET /index.html HTTP/1.0" 500 -
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 43539)
Traceback (most recent call last):
  File "/usr/lib/python2.6/SocketServer.py", line 283, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python2.6/SocketServer.py", line 309, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python2.6/SocketServer.py", line 322, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python2.6/SocketServer.py", line 618, in __init__
    self.finish()
  File "/usr/lib/python2.6/SocketServer.py", line 661, in finish
    self.wfile.flush()
  File "/usr/lib/python2.6/socket.py", line 303, in flush
    self._sock.sendall(buffer(data, write_offset, buffer_size))
error: [Errno 32] Broken pipe
----------------------------------------

Пытаюсь обратиться с ПЭВМ из ЛВС-так в браузере-не мол соединения…(хотя между собой ПЭВМ pingeуются)..а на серверной части никаких строк не появляются.

Вообщем-то даже если я до максимального упростил всё-картина не поменялась((
fata1ex
cutwater, я прочитал. После прочтения понял, что мы теперь просто обязаны разобраться и понять, что же там не так :)

Вообще, broken pipe может появиться, если клиент отвалился, а сервер не успел или не смог ответить клиенту. Какие-то нелады у вас именно в системе. Можете подождать ответа здесь. Можно попробовать написать на stackoverflow, там народу побольше.
Novichek
Спасибо)и там жду, может что отпишут..и на предложенном сайте тоже отписался…в любом случае если кто знает, в чём может быть причины такой общего характера ошибки-просьба отписать…рано или поздно всё же найдётя причина…и можно будет здесь написать в чём же была соль.
fata1ex
Единственное, что мне приходит в голову в таких ситуациях - слово “декомпозиция”. Попробуйте с минимального примера наращивать нужную вам систему. Поочередно добавляя компоненты, вы поймете, где же проблема. Удачи!

Если решение настигнет вас, обязательно отпишитесь здесь.
Novichek
fata1ex
Единственное, что мне приходит в голову в таких ситуациях - слово “декомпозиция”. Попробуйте с минимального примера наращивать нужную вам систему. Поочередно добавляя компоненты, вы поймете, где же проблема. Удачи!

Если решение настигнет вас, обязательно отпишитесь здесь.
Так собсвенно весь процесс описан…проблема возникла,когда начал использовать именно flask
Хотя как я понимаю-ошибка возникшая-общего характера…
и вот не понятно почему возникла..вроде же всё поэтапно делал(см. выше)
cutwater
Пойдем от противного

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello World!"
if __name__ == "__main__":
    app.run()

Запустите у себя

P.S. Кстати версия python какая? Версия Flask ?
alexey-grom
Broken pipe тут определенно не с проста!

Никого не смутило что экзепшн на порте 43539, а сервер он запускает на 5000?
Проверьте свой оракл, путем тупого выполнения того когда, который у вас в обработчике http-запроса

Что за порт 43539 не понятно. Похоже это он не СУБД. Если бы проблема была в коде обработчика - в трейсе было бы видно где ошибка. Сместите внимание на wsgi и убейте апач - работайте с фласком напрямую. Возможно это что-то прояснит.

Думаю решение вашей проблемы лежит именно в ключе выяснения что за порт 43539, и почему на нем Broken pipe
Novichek
Попробовал переустановить Flask,может не правильно что-то установилось:

#yum install python-pip.noarch
....
#pip install Flask --upgrade
...
#pip --version
pip 0.6.3
#python -V 
>Python 2.6.6

Я попробовал приметивный пример запустить:

#!/usr/bin/env python 
#-*-coding: utf-8 
app = Flask(__name__)
@app.route('/')
def hello():
    return 'Hello World'
app.run()
Предлагаемы пример работает-получаю страницу-hello word!в содержании, но только в локале. Внешне обратиться не получается(((соединения клиенсткой части приложения с серверной-не происходит((

пробую свой скрипт запустить по работе с БД-на теже грабли наступаю((ошибка та же((
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