Dynamic generation of images (was Re: Custom Classes?)

J. Cliff Dyer jcd at sdf.lonestar.org
Fri May 9 10:02:49 EDT 2008


On Thu, 2008-05-08 at 10:33 -0500, Victor Subervi wrote:
> Okay, trying this again with everything working and no ValueError or
> any other errors, here we go:
> 
> Load this code. Unless you use a similar login() script, you will want
> to edit your own values into the user, passwd, db and host:
> 
> #!/usr/bin/python
> 
> import MySQLdb
> 
> import sys,os
> sys.path.append(os.getcwd())
> from login import login
> user, passwd, db, host = login()
> 
> pic = "pic1"
> w = 20
> x = 0
> d = 6
> y = 1
> 
> getpic = "getpic" + str(w) + ".py"
> try:
>   os.remove(getpic)
> except:
>   pass
> code = """
> #!/usr/local/bin/python
> import cgitb; cgitb.enable()
> import MySQLdb
> import cgi
> import sys,os
> sys.path.append(os.getcwd())
> from login import login
> user, passwd, db, host = login()
> form = cgi.FieldStorage()
> picid = int(form["id"].value)
> x = int(form["x"].value)
> pics =
> {1:'pic1',2:'pic1_thumb',3:'pic2',4:'pic2_thumb',5:'pic3',6:'pic3_thumb',7:'pic4',8:'pic4_thumb',\
> 9:'pic5',10:'pic5_thumb',11:'pic6',12:'pic6_thumb'}
> pic = pics[x]
> db = MySQLdb.connect(host, user, passwd, db)
> cursor= db.cursor()
> sql = "select %s from products where id='%s';" % (pic, str(picid))
> 
> cursor.execute(sql)
> content = cursor.fetchall()[0][0].tostring()
> cursor.close()
> print 'Content-Type: image/jpeg'
> print
> print content
> """
> script = open(getpic, "w")
> script.write(code)
> script.close()
> 
> 
> 
> and then surf to:
> http://whatever.url/getpic20.py?id=6&x=1
> 
> 
> Also, please re-send the link on how to post good questions to the
> list. I cannot find it.
> TIA,
> Victor

Why are you dynamically creating getpic20.py?

Obviously, in the real script, you probably have several of them:
getpic1.py, getpic2.py, etc., but is there any reason you couldn't just
have one getpic.py, and pass the number in as a parameter in your GET
request, like this:

http://localhost/getpic.py?id=6&x=1&w=20

Then you can just have a static getpic.py.  I've stripped out useless
bits:

* You don't use sys or os, so why import them?
* MySQL makes it difficult for me to replicate your behavior, because I 
  don't have your DB setup.  The DB call has been replaced with a
  dictionary of keys into JPG data, pulled from the filesystem.  Change 
  filenames to jpegs on your own hard drive
* login is useless without MySQL.

So your new getpic.py (statically created) looks like this:

~~~ getpic.py ~~~
#!/usr/local/bin/python

import cgitb; cgitb.enable()
import cgi

pics = { 
    1: open('pic.jpg').read(),
    2: open('pic2.jpg').read()
}
# you could just pass the filename, and then you wouldn't have to load
the
# image data in advance, but this more closely mimics the concept of
your DB 
# setup.

form = cgi.FieldStorage()
x = int(form["x"].value)
pic = pics[x]

print 'Content-Type: image/jpeg'
print
print pic
~~~

Then if you want to include your pictures in a web page, you do

~~~ show_pics.html ~~~
<html>
  <head><title>Pictures</title></head>
  <body>
    <h1>pictures</h1>
    <img src='http://example.com/getpic.py?x=1'/>
    <img src='http://example.com/getpic.py?x=2'/>
  </body>
</html>
~~~

This should work just as well when you refactor the script to pull from
the database.

Hope this helps.  Also, the article on asking good questions is
available here:  http://catb.org/~esr/faqs/smart-questions.html






More information about the Python-list mailing list