Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 27, 2011 23:14:26

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

Вопросы по пониманию наследования классов (BaseHTTPRequestHandler)

Есть желание написать web интерфейс к одному приложению. Пытаюсь разобраться с BaseHTTPServer. Гугл и поиск по форуму до конца не помог.

#!/usr/bin/python
# -*- encoding: utf-8 -*-

import cgi
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

class WebHandler(BaseHTTPRequestHandler):

def __init__(self, request, client_address, server):
BaseHTTPRequestHandler.__init__(self, request, client_address, server)

def do_GET(self):
if self.path.endswith("test"):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write('test')
self.wfile.write(self.path)
elif self.path == '/':
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write('<form method=POST action="/add"><input name="name" value="123"><input type=submit></form>')

def do_POST(self):
form = cgi.FieldStorage(fp=self.rfile, headers=self.headers, environ={'REQUEST_METHOD':'POST', 'CONTENT_TYPE':self.headers['Content-Type'],})
for field in form.keys():
print field, form[field].value

httpd = HTTPServer((host, port), WebHandler)
print "server starting on %s:%s" % (host, port)
httpd.serve_forever()
Код простой и работает. Параметры с формы передаются на урл “/add” и выводятся в консоль принтом. Но есть одно но. WebHandler у меня наследник класса BaseHTTPHandler, соответственно, мне хочется расширить этот класс, добавить несколько свойств и методов, но это оказалось не так просто, как я думал. Для того, чтобы добавить свойства в класс, я сделал перегрузку метода init, передав все его параметры оригинальному классу init из BaseHTTPHandler. Вот тут меня терзают смутные сомнения - правильно ли так делать? Эксепшнов никаких на этот момент не получаю и всё работает. Но если например, я в конце метода инициализации напишу что-нибудь вроде: self.my_var = ‘test’, а потом попытаюсь обратиться к self.my_var в методе скажем, do_POST, то получу эксепшн AttributeError: WebHandler instance has no attribute ‘my_var’. В рамках самого метода init я эту переменную вижу. Плюс, в консоль алерты и вывод, находящиеся в init, падают при обновлении страницы, выдаваемой сервером. То есть, получается, что наследник BaseHTTPHandler каждый раз создаётся заново при обращении к веб серверу. А если мне внутрь хэндлера нужно что-то передавать, как это лучше сделать? Например, у меня есть ряд шаблонов, который будучи единожды загруженным с жёсткого диска и обработанным должным образом один раз, будет использоваться каждый раз при запросе. Придётся создавать наследника HTTPServer? И как мне в хэндлер из него передать некий объект, если он всё-равно дальше init виден не будет?

В общем, я в замешательстве.



Офлайн

#2 Окт. 28, 2011 00:21:25

Fibio
От:
Зарегистрирован: 2010-09-14
Сообщения: 74
Репутация: +  2  -
Профиль   Отправить e-mail  

Вопросы по пониманию наследования классов (BaseHTTPRequestHandler)

вы все правильно думаете насчет расширение инит путем добавления, но я бы добавила переменную my_var в атрибуты ф-ции со значением ‘test’ по умолчанию:
class WebHandler(BaseHTTPRequestHandler):

def __init__(self, request, client_address, server, my_var='test'):
BaseHTTPRequestHandler.__init__(self, request, client_address, server)
self.my_var = my_var



Отредактировано (Окт. 28, 2011 00:22:02)

Офлайн

#3 Окт. 28, 2011 13:29:35

Yurietc
От:
Зарегистрирован: 2007-07-18
Сообщения: 112
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы по пониманию наследования классов (BaseHTTPRequestHandler)

С BaseHTTPHandler не работал, но из общих соображений - не всегда можно просто перегружать методы (особенно конструктор) так как может понадобиться функциональность реализованная в методе родительского класса. В таких случаях иногда нужно запускать родительский метод посредством super после (перед) выполнения метода наследника.



Офлайн

#4 Ноя. 17, 2011 19:36:39

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

Вопросы по пониманию наследования классов (BaseHTTPRequestHandler)

Yurietc
В таких случаях иногда нужно запускать родительский метод посредством super после (перед) выполнения метода наследника.
О! Про такое я пока даже не слышал. Спасибо!



Офлайн

#5 Ноя. 18, 2011 06:32:45

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Вопросы по пониманию наследования классов (BaseHTTPRequestHandler)

> То есть, получается, что наследник BaseHTTPHandler каждый раз создаётся заново при обращении к веб серверу.
Вполне возможно

> А если мне внутрь хэндлера нужно что-то передавать, как это лучше сделать? Например, у меня есть ряд шаблонов, который будучи единожды загруженным с жёсткого диска и обработанным должным образом один раз, будет использоваться каждый раз при запросе.
Сделать глобальную переменную

> Есть желание написать web интерфейс к одному приложению.
Глянте на http://bottlepy.org/docs/dev/

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version