Найти - Пользователи
Полная версия: Вопросы по пониманию наследования классов (BaseHTTPRequestHandler)
Начало » Python для новичков » Вопросы по пониманию наследования классов (BaseHTTPRequestHandler)
1
corpse
Есть желание написать 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 виден не будет?

В общем, я в замешательстве.
Fibio
вы все правильно думаете насчет расширение инит путем добавления, но я бы добавила переменную 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
Yurietc
С BaseHTTPHandler не работал, но из общих соображений - не всегда можно просто перегружать методы (особенно конструктор) так как может понадобиться функциональность реализованная в методе родительского класса. В таких случаях иногда нужно запускать родительский метод посредством super после (перед) выполнения метода наследника.
corpse
Yurietc
В таких случаях иногда нужно запускать родительский метод посредством super после (перед) выполнения метода наследника.
О! Про такое я пока даже не слышал. Спасибо!
o7412369815963
> То есть, получается, что наследник BaseHTTPHandler каждый раз создаётся заново при обращении к веб серверу.
Вполне возможно

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

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