Форум сайта python.su
Есть желание написать 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()
Офлайн
вы все правильно думаете насчет расширение инит путем добавления, но я бы добавила переменную 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)
Офлайн
С BaseHTTPHandler не работал, но из общих соображений - не всегда можно просто перегружать методы (особенно конструктор) так как может понадобиться функциональность реализованная в методе родительского класса. В таких случаях иногда нужно запускать родительский метод посредством super после (перед) выполнения метода наследника.
Офлайн
YurietcО! Про такое я пока даже не слышал. Спасибо!
В таких случаях иногда нужно запускать родительский метод посредством super после (перед) выполнения метода наследника.
Офлайн
> То есть, получается, что наследник BaseHTTPHandler каждый раз создаётся заново при обращении к веб серверу.
Вполне возможно
> А если мне внутрь хэндлера нужно что-то передавать, как это лучше сделать? Например, у меня есть ряд шаблонов, который будучи единожды загруженным с жёсткого диска и обработанным должным образом один раз, будет использоваться каждый раз при запросе.
Сделать глобальную переменную
> Есть желание написать web интерфейс к одному приложению.
Глянте на http://bottlepy.org/docs/dev/
Офлайн