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, а на серверной части никаких даже строк не образовалось новых..видимо то ли с ЛВС обращение не дошло либо сразу же закрылся скрипт по отнощению к запросу из ЛВС…
В краткости вроде всё описал. У кого есть мысли по разрешению данного вопроса?