Уведомления

Группа в Telegram: @pythonsu

#1 Март 30, 2012 06:57:29

Novichek
Зарегистрирован: 2012-03-27
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

создание стартовой страницы на питоне

Доброе время суток всем!
Сразу хотел бы сказать,что опыта с web и работы c python'oм на уровне начинающего, но уже разобрался как работать из питона с MS SQL и Oracle 11G-но в виде просто консольного скрипта.
а мне допустим хотелось бы создать некую старотовую web-страницу, чтобы допустим можно было это скрипт запустить,используя к примеру кнопку на стартовой web-cстранице через браузер клиента ЛВС.
Как это можно реализовать(если есть мануал на рус яз)?
сейчас у меня скрипт(по работе с MS SQL) представляет из себя примерно сл. структуру:

#!-*-coding: cp1251 -7
import os,pymssql,sys
os.putenv("NLS_LANG","RUSSIAN_RUSSIA.UTF8")
def fun_mssql():
.....
    conect=pymssql.connect(......)
    ......
    rez=conect.fetchall()
    conect.close
    return rez
........
def fun1(argumm):
   .......
    k=fun_mssql()
#работа с файлами и каталогами+запись логов в тектовые файлы+вывод результата в консоль через #print
   .....
if "__main__"==__name__:
    argumme=sys.argv[1]
    fun1(argumme)


я пробовал ещё Flask
вот примерный код скрипта у меня был:
#!/usr/bin/env python
#!-*-coding: cp1251 -7
import os,pymssql,sys
os.putenv("NLS_LANG","RUSSIAN_RUSSIA.UTF8")
#импортируем класс Flask
from flask import Flask
from flask import render_trmplate
DEBAG=True
#создаём экземпляр app класса Flask. Экземпляр уже явл wsgi-приложением
app=Flask(__name__)
@app.route('/index1.html',methods=['GET'])
def fun_mssql():
.....
    conect=pymssql.connect(......)
    ......
    rez=conect.fetchall()
    conect.close
    return rez
def fun1(argumm):
   .......
    k=fun_mssql()
#работа с файлами и каталогами+запись логов в тектовые файлы+вывод результата в консоль через #print
   .....
   return render_template('index1.html',key_one=k)
if __name__=="__main__":
    app.run(debug=True, host='0.0.0.0')

потом создал два каталога в ручную в той же директории,где расположен был скрипт:
/var/www/html/py

1)/var/www/html/py/static
2)/var/www/html/py/templates

static содержит файл стилей оформления style.css
templates содержит шаблон стартовой страницы index1.html, содержание которой примерно такое:
<!doctype html>
<title> Стартовая страница </title>
{% extends "index1.html" %}
{% block body %}
{% if session.logged_in %}
<meta content="text/html; charset=windows-1251">
<link href="style.css" rel="stylesheet" type="text/css"> </link>
<form>
<p><h1> Стартовая страница</h1></p>
<table>
<tr>
<th>Ответ на запрос</th>
</tr>
<tr>
<th>{{key_one}}</th>
</tr>
</table>
</form>
{% endif %}
<ul class=entries>
{% for entry in entries %}
{% else %}
<li><em>Unbelievable</em>
<% endfor %>
</ul>
{% endblock %}
запускаю свой скрипт на серверной части:
[nov@server py]# python hello.py
* Running on http://127.0.0.1:5000/
 * Restarting with reloader...
сдалал вывод скрипт запустился на 5000 порту,значит и обратиться к серверной части нужно по 5000 порту,что и делаю в браузере с другой ПЭВМ этой же ЛВС, в строке url пишу:
http://ip_adrr_server:5000/index1.html
и получаю ответ:ОШИБКА 500: INTERNAL SERVER ERROR.
а на серверной части,где я запусти скрипт получаю сл информацию:
* Running on http://127.0.0.1:5000/
 * Restarting with reloader...
127.0.0.1 - - [17/Feb/2012 11:37:54] "GET /index1.html HTTP/1.0" 500 -
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 44224)
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

пробовал из локали обратиться к сервеной части,тоже самое…даже попробовал таким образом из локале обратиться:
wget 'http://127.0.0.1:5000/index1.html'
тоже самое получил.

вообщем как сами понимаете,результата я не достиг((+и не понял как кнопку реализовать.
В итге Flask теоретически понравился и вроде разобрался,но на практике не получилось((

Отредактировано Novichek (Март 30, 2012 11:16:06)

Офлайн

#2 Март 30, 2012 09:25:21

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

создание стартовой страницы на питоне

Из Вашего кода понять что же не так довольно таки сложно.
На данный момент я вижу одну ошибку.

Novichek
rez=conect.fetchall()
conect.close
return rez

Вы в обработчике запроса возвращаете результат fetchall а должны бы результат render_template,
вызов которой вообще находится в никак не связанной с обработчиком запроса функции.

Ну и в connect.close очевидно скобки забыли. Хотя этот факт никак не влияет на некорректное поведение программы.

P.S. так вот опять таки судя по Вашему коду декоратор @app.route надо было применять к fun1 а не к fun_mssql
И убрать аргумент fun1.
P.P.S. код таки ужасен, именование функций вообще ни разу не очевидно.



Отредактировано cutwater (Март 30, 2012 09:28:46)

Офлайн

#3 Март 30, 2012 10:57:48

Novichek
Зарегистрирован: 2012-03-27
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

создание стартовой страницы на питоне

больше интересует то,что Вы написали сл.: “Вы в обработчике запроса возвращаете результат fetchall а должны бы результат render_template,”

а так не правильно?

def fun_mssql():
.....
    conect=pymssql.connect(......)
    ......
    rez=conect.fetchall()
    conect.close()
    return rez
@app.route('/index1.html',methods=['GET'])
def fun1(argumm):
   .......
    k=fun_mssql()
    return render_template('index1.html',key_one=k)
if __name__=="__main__":
    app.run(debug=True, host='0.0.0.0')

тогда шаблон ,во-первых, покажется ли в браузере у клиента ЛВС, а ,во-вторых, заполниться ли правильно?

Отредактировано Novichek (Март 30, 2012 11:01:11)

Офлайн

#4 Март 30, 2012 11:44:54

Novichek
Зарегистрирован: 2012-03-27
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

создание стартовой страницы на питоне

я так попробовал с локале через wget, но увы так и выскакивает ошибка 500 на клиенте((
httpd запущен.сервер MSSQL тоже запущен-коннект есть(поэтому вопрос соединения отпадает)

на клиентской части:


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


а на серверной части пишет debag следующее:

* Running on http://127.0.0.1:5000/
 * Restarting with reloader...
127.0.0.1 - - [30/Mar/2012 11:35:20] "GET /index1.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

Офлайн

#5 Март 30, 2012 13:58:30

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

создание стартовой страницы на питоне

Приведите минимальный законченный пример, на котором проявляется ошибка.



Офлайн

#6 Апрель 2, 2012 02:36:28

Novichek
Зарегистрирован: 2012-03-27
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

создание стартовой страницы на питоне

вот сам скрипт:

#!/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')

Поясню сразу-не смотрите на слова внутри .connect-там естесвенно я заменил действующее наименование БД, имя пользователя, адрес и т.п.-вообщем просто интуитивнопонятными словами заменил.Сам connect в обеиз используемых ыункциях отрабатывает отдельно,если записать в скрипте,отдельно созданном-поэтому вопрос к .connect'e отпадает-здесь что-то другое.


обращение с локали:

[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]# 

запуск и отображение debag-информации на серверной части:

[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
----------------------------------------

имеется два каталога,которые создал вручную
1)/var/www/html/py/static
2)/var/www/html/py/templates

static содержит файл стилей оформления style.css

templates содержит шаблон стартовой страницы index.html, содержание такое:

<!doctype html>
<title> Стартовая страница </title>
{% extends "index1.html" %}
{% block body %}
{% if session.logged_in %}
<meta content="text/html; charset=windows-1251">
<link href="style.css" rel="stylesheet" type="text/css"> </link>
<form>
<p><h1> Стартовая страница</h1></p>
<table>
<tr>
<th>Ответ на запрос Oracle</th>
</tr>
<tr>
<th>{{keyone}}</th>
</tr>
<tr>
<th>Ответ на запрос MSSQL</th>
</tr>
<tr>
<th>{{keytwo}}</th>
</tr>
</table>
</form>
{% endif %}
<ul class=entries>
{% for entry in entries %}
{% else %}
<li><em>Unbelievable</em>
<% endfor %>
</ul>
{% endblock %}


что может быть не так?вроде же всё правильно же написано или что-то я упустил?. Это я пытался через Flask всё
или модет что-то apache или настройки wsgi?но вроде я их настраивал-ранее работали вроде.


Отредактировано Novichek (Апрель 2, 2012 04:15:24)

Офлайн

#7 Апрель 3, 2012 10:15:41

Novichek
Зарегистрирован: 2012-03-27
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

создание стартовой страницы на питоне

Нет не у кого мысли,в связи с чем ошибка выскакивает? Хотелось бы,чтобы это всё дело заработало.

Отредактировано Novichek (Апрель 3, 2012 10:16:05)

Офлайн

#8 Апрель 3, 2012 11:24:14

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

создание стартовой страницы на питоне

Судя по твоему коду, тут точно должна быть ошибка

Novichek
Нет не у кого мысли,в связи с чем ошибка выскакивает? Хотелось бы,чтобы это всё дело заработало.

{% for entry in entries %}
{% else %}                   #??????
<li><em>Unbelievable</em>
<% endfor %>             #??????



Офлайн

#9 Апрель 4, 2012 02:33:45

Novichek
Зарегистрирован: 2012-03-27
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

создание стартовой страницы на питоне

я вообще шаблон переделал, попробовал так, вместо вышеуказанного:

<!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>


пробую так же как вышеуказывал…та же ошибка выходит(((
error: Broken pipe


В чём причина возникновения подобной ошибки?И вообще в чём она заключается?я погуглил,но однозначного ответа на этот вопрос не могу найти(

Отредактировано Novichek (Апрель 4, 2012 08:35:57)

Офлайн

#10 Апрель 4, 2012 09:29:26

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

создание стартовой страницы на питоне

Вам же пишут, что ошибка при работе с сокетом. А вообще, программист, который при ошибке ‘broken pipe’ начинает работать с шаблонами, вызывает подозрительния )

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



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version