Найти - Пользователи
Полная версия: CGIHandler и работа с sys.stdout
Начало » Web » CGIHandler и работа с sys.stdout
1
boom
Привет!

Меня заинтересовал функционал модуля 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?
usmix
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>"
boom
О! Спасибо! То что так долго искал
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