listing26-5.py 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #!/usr/bin/python
  2. print('Content-type: text/html\n')
  3. import cgitb; cgitb.enable()
  4. import psycopg2
  5. conn = psycopg2.connect('user=foo password=bar dbname=baz')
  6. curs = conn.cursor()
  7. print("""
  8. <html>
  9. <head>
  10. <title>The FooBar Bulletin Board</title>
  11. </head>
  12. <body>
  13. <h1>The FooBar Bulletin Board</h1>
  14. """)
  15. curs.execute('SELECT * FROM messages')
  16. rows = curs.dictfetchall()
  17. toplevel = []
  18. children = {}
  19. for row in rows:
  20. parent_id = row['reply_to']
  21. if parent_id is None:
  22. toplevel.append(row)
  23. else:
  24. children.setdefault(parent_id, []).append(row)
  25. def format(row):
  26. print('<p><a href="view.cgi?id={id}i">{subject}</a></p>'.format(row))
  27. try: kids = children[row['id']]
  28. except KeyError: pass
  29. else:
  30. print('<blockquote>')
  31. for kid in kids:
  32. format(kid)
  33. print('</blockquote>')
  34. print('<p>')
  35. for row in toplevel:
  36. format(row)
  37. print("""
  38. </p>
  39. <hr />
  40. <p><a href="edit.cgi">Post message</a></p>
  41. </body>
  42. </html>
  43. """)