Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 31, 2011 16:51:26

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

CGIHandler и работа с sys.stdout

Привет!

Меня заинтересовал функционал модуля wsgiref.handlers, и решил попробовать использовать CGIHandler

# -*- coding: utf-8 -*-

import wsgiref.handlers
import os
import sys

def application(environ, start_response):
out = sys.stdout;
environ = dict(os.environ.items())

start_response('200 OK', [('Content-Type', 'text/html')])

return '';

#print('test');

wsgiref.handlers.CGIHandler().run(application)
В описании сказано, что я могу работать с окружением CGI, os.environ, sys.stdout, sys.stdin, sys.stderr

Дайте пожалуйста какой-нибудь пример, с выводом данных из sys.stdout. Вообще application может вернуть, всё что находится в sys.stdout?



Офлайн

#2 Сен. 4, 2011 12:35:19

usmix
От:
Зарегистрирован: 2011-07-08
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

CGIHandler и работа с sys.stdout

boom
Дайте пожалуйста какой-нибудь пример, с выводом данных из sys.stdout…
Привет! Вот пример:

# -*- coding: cp1251 -*-

from wsgiref.handlers import CGIHandler
import sys

class WritableObject:
'''Класс для переопределения методов write и flush'''
def __init__(self):
self.lines = []

def write(self, s):
if len(s.strip()) > 0:
self.lines.append(s)

def flush(self):
pass

def readlines(self):
return self.lines

def __del__(self):
self.lines = None

class HookedStdout:
'''Класс для захвата стандартного вывода'''
def __init__(self):
sys.stdout = sys.stderr = WritableObject()

def __del__(self):
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__

class MyCGIHandler(CGIHandler):
'''Переопределяем CGIHandler, чтобы захватить "евоный" стандартный вывод'''
def __init__(self):
self.stdout = HookedStdout()
CGIHandler.__init__(self)

def __enter__(self):
return self

def __exit__(self, type, value, traceback):
self.__del__()

def readlines(self):
return self.stdout.readlines()

def __del__(self):
self.stdout = None

def application(environ, start_response):
'''WSGI application'''
start_response('200 OK', [('Content-Type', 'text/html')])
return ['<HTML><BODY><P>Hello, World !!!</P></BODY></HTML>'];

'''Начало программы'''
if __name__ == '__main__':
with MyCGIHandler() as cgi:
cgi.run(application)
for i, line in enumerate(cgi.readlines()):
print 'Line %d: "%s"' % (i, line.strip().replace('\r\n', ';'))
Результат:

Line 0: "Status: 200 OK"
Line 1: "Content-Type: text/html;Content-Length: 49"
Line 2: "<HTML><BODY><P>Hello, World !!!</P></BODY></HTML>"



Офлайн

#3 Сен. 4, 2011 21:49:17

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

CGIHandler и работа с sys.stdout

О! Спасибо! То что так долго искал



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version