Redirect console output to a Django HttpResponse
Say you have some Python code that prints to the console, and you want to re-use that code in a Django view, but output the print statements as HTML in the HttpResponse. Perhaps, like me, you have a batch job that you're calling from ./manage.py script that you would also like to call from an HTTP request and see the results as text/HTML. Here is a decorator that does just that.
import sys from django.http import HttpResponse def print_http_response(f): """ Wraps a python function that prints to the console, and returns those results as a HttpResponse (HTML)""" class WritableObject: def __init__(self): self.content = [] def write(self, string): self.content.append(string) def new_f(*args, **kwargs): printed = WritableObject() sys.stdout = printed f(*args, **kwargs) sys.stdout = sys.__stdout__ return HttpResponse(['<BR>' if c == '\n' else c for c in printed.content ]) return new_f
If you attached it like so to a view...
@print_http_response def my_view(request): print "some output here" for i in [1, 2, 3]: print i
It would output the following HTML:
some output here<BR> 1<BR> 2<BR> 3<BR>