本文共 5794 字,大约阅读时间需要 19 分钟。
由于最近学习Python,从最基础的Python基础教程学起,其中最后的十个项目还是很不错的。个人认为。本人新手,如有错误,还请指教。
书上用的是PostgreSQL,这里用的是MySQL。由于这是一个CGI项目。所以事先需要准备一个可以运行CGI脚本的试验环境。
本次用的是Apache运行cgi。配置网上很多。
其次需要创建一个数据表:
1 2 3 4 5 6 7 8 | CREATE TABLE `messages` ( `id` int (11) NOT NULL AUTO_INCREMENT, `subject` varchar (100) NOT NULL , `sender` varchar (15) NOT NULL , `reply_to` int (11) DEFAULT NULL , `text` mediumtext NOT NULL , PRIMARY KEY (`id`) ) |
一个简单的公告板,主要功能:显示所有公告、查看单个公告、编辑公告、保存公告、删除公告(个人增加的)。根据这些功能可以创建五个对应的脚本:main.cgi、view.cgi、edit.cgi、save.cgi、delete.cgi
一、下面废话省略,直接上代码和运行图片:
1、main.cgi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #!/usr/bin/python print 'Content-type: text/html\n' import cgitb; cgitb.enable() import MySQLdb conn = MySQLdb.connect(host = 'localhost' ,user = 'root' , db = 'blog' ) curs = conn.cursor() print """ <html> <head> <title>The Blog Bulletin</title> </head> <body> <h1>The Blog Bulletin</h1> """ curs.execute( 'select * from messages' ) rows = curs.fetchall() toplevel = [] children = {} for row in rows: parent_id = row[ 3 ] if parent_id is None : toplevel.append(row) else : children.setdefault(parent_id,[]).append(row) def format (row): print '<p><a href="view.cgi?id=%i">%s</a> | <a href="delete.cgi?id=%i">Delete</a></p>' % (row[ 0 ],row[ 1 ],row[ 0 ]) try : kids = children[row[ 0 ]] except KeyError: pass else : print '<blockquote>' for kid in kids: format (kid) print '</blockquote>' print '<p>' for row in toplevel: format (row) print """ </p> <hr /> <p><a href="edit.cgi">Post Message</a></p> </body> </html> """ |
2、view.cgi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #!/usr/bin/python print 'Content-type: text/html\n' import cgitb; cgitb.enable() import MySQLdb conn = MySQLdb.connect(host = 'localhost' ,user = 'root' ,db = 'blog' ) curs = conn.cursor() import cgi,sys form = cgi.FieldStorage() id = form.getvalue( 'id' ) print """ <html> <head> <title>View Message</title> </head> <body> <h1>View Mesage</h1> """ try : id = int ( id ) except : print 'Invalid message ID' sys.exit() curs.execute( 'select * from messages where id=%i' % id ) rows = curs.fetchall() if not rows: print 'Unknown message ID' sys.exit() row = rows[ 0 ] print """ <p><b>Subject:</b> %s<br /> <b>Sender:</b> %s<br /> <pre>%s</pre> </p> <hr /> <a href='main.cgi'>Back Home</a> | <a href='edit.cgi?reply_to=%s'>Reply</a> </body> </html> """ % (row[ 1 ],row[ 2 ],row[ 4 ],row[ 0 ]) |
3、edit.cgi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #!/usr/bin/python print 'Content-type: text/html\n' import cgitb; cgitb.enable() import MySQLdb conn = MySQLdb.connect(host = 'localhost' , user = 'root' , db = 'blog' ) curs = conn.cursor() import cgi, sys form = cgi.FieldStorage() reply_to = form.getvalue( 'reply_to' ) print """ <html> <head> <title>Compose Message</title> </head> <body> <h1>Compose Message</h1> <form action='save.cgi' method='POST'> """ subject = '' if reply_to is not None : print '<input type="hidden" name="reply_to" value="%s"/>' % reply_to curs.execute( 'select subject from messages where id=%s' % reply_to) subject = curs.fetchone()[ 0 ] if not subject.startswith( 'Re: ' ): subject = 'Re: ' + subject print """ <b>Subject:</b><br /> <input type='text' size='40' name='subject' value='%s' /><br /> <b>Sender:</b><br /> <input type='text' size='40' name='sender' /><br /> <b>Message:</b><br /> <textarea name='text' cols='40' rows='20'></textarea><br /> <input type='submit' value='Save'/> </form> <hr /> <a href='main.cgi'>Back Home</a> </body> </html> """ % subject |
4、save.cgi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #!/usr/bin/python print 'Content-type: text/html\n' import cgitb; cgitb.enable() def quote(string): if string: return string.replace( "'" , "\\'" ) else : return string import MySQLdb conn = MySQLdb.connect(host = 'localhost' , user = 'root' , db = 'blog' ) curs = conn.cursor() import cgi, sys form = cgi.FieldStorage() sender = quote(form.getvalue( 'sender' )) subject = quote(form.getvalue( 'subject' )) text = quote(form.getvalue( 'text' )) reply_to = form.getvalue( 'reply_to' ) if not (sender and subject and text): print 'Plz supply sender, subject, and text' sys.exit() if reply_to is not None : query = """ insert into messages(reply_to, sender, subject, text) value(%i, '%s', '%s', '%s')""" % ( int (reply_to), sender, subject, text) else : query = """ insert into messages(sender, subject, text) value('%s', '%s', '%s')""" % (sender, subject, text) curs.execute(query) conn.commit() print """ <html> <head> <title>Message Saved</title> </head> <body> <h1>Message Saved</h1> <hr /> <a href='main.cgi'>Back Home</a> </body> </html>s """ |
5、delete.cgi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #!/usr/bin/python print 'Content-type: text/html\n' import cgitb; cgitb.enable() import MySQLdb conn = MySQLdb.connect(host = 'localhost' , user = 'root' , db = 'blog' ) curs = conn.cursor() import cgi, sys form = cgi.FieldStorage() id = form.getvalue( 'id' ) print """ <html> <head> <title>Delete Page</title> </head> <body> <h1>Delete Page!</h1> """ try : id = int ( id ) except : print "Invalid message ID." sys.exit() print """ <p>Delete subject object successful.<p> """ curs.execute( 'delete from messages where id=%i' % id ) conn.commit() print """ </p> <hr /> <p><a href="main.cgi">Back Home</a></p> </body> </html> """ |
二、运行截图
本文转自Mr_陈 51CTO博客,原文链接:http://blog.51cto.com/chenpipi/1588007,如需转载请自行联系原作者