Tompa wrote: > Hi, > > I would like to create images on the fly as a response to an http request. > I can do this with PIL like this (file create_gif.py): > from PIL import Image, ImageDraw > > print 'Status: 200 OK' > print 'Content-type: text/html' > print > print '<HTML><HEAD><TITLE>Python Dynamic Image Creation > Test</TITLE></HEAD>' print '<BODY>' > im = Image.new("P", (600, 400)) > draw = ImageDraw.Draw(im) > draw.rectangle((0, 0) + im.size, fill="blue") > im.save("images/tmp.gif"); > print '<img src="/scripts/images/tmp.gif">' > print '</BODY>' > > > However, I would like to 1) avoid saving the image in a file on disk and > 2) separate the HTLM code from the python image creation code. > > Something like this is what I have in mind: > (file index.html): > <html> > <head><meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8"> > <title>Python Dynamic Image Creation</title> > </head> > <IMG SRC="/scripts/create_image.py" ALT="Image created on the fly..."> > </html> > > and in file create_image.py: > from PIL import Image, ImageDraw, ImageFont > im = Image.new("P", (600, 400)) > draw = ImageDraw.Draw(im) > draw.rectangle((0, 0) + im.size, fill="blue") > > > Unfortunately this does not work :-( > What is missing?
You are almost there. Your create_image.py does not return anything to the browser yet. First return proper HTTP headers, e.g. sys.stdout.write('Status: 200 OK\r\n') sys.stdout.write('Content-type: image/gif\r\n') sys.stdout.write('\r\n') (Your prints above are mostly equivalent, but do not output the correct \r\n as line terminator - at least on UNIX style systems. Most webservers tolarate this, if it's coming from a CGI - but doing it right and not relying on a certain server behaviour is not bad anyway ;) Then check the PIL docs to find out, how to output the image to sys.stdout (instead of writing to a file). -- Benjamin Niemann Email: pink at odahoda dot de WWW: http://www.odahoda.de/ -- http://mail.python.org/mailman/listinfo/python-list