由于最近学习Python,从最基础的Python基础教程学起,其中最后的十个项目还是很不错的。个人认为。本人新手,如有错误,还请指教。

书上用的是PostgreSQL,这里用的是MySQL。由于这是一个CGI项目。所以事先需要准备一个可以运行CGI脚本的试验环境。

本次用的是Apache运行cgi。配置网上很多。

其次需要创建一个数据表:

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

#!/usr/bin/pythonprint 'Content-type: text/html\n'import cgitb; cgitb.enable()
import MySQLdbconn=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: passelse: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

#!/usr/bin/pythonprint 'Content-type: text/html\n'import cgitb; cgitb.enable()
import MySQLdbconn=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

#!/usr/bin/pythonprint 'Content-type: text/html\n'import cgitb; cgitb.enable()
import MySQLdbconn=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_tocurs.execute('select subject from messages where id=%s' % reply_to)subject=curs.fetchone()[0]if not subject.startswith('Re: '):subject='Re: '+ subjectprint """<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

#!/usr/bin/pythonprint 'Content-type: text/html\n'import cgitb; cgitb.enable()def quote(string):if string:return string.replace("'", "\\'")else:return stringimport 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

#!/usr/bin/pythonprint 'Content-type: text/html\n'import cgitb; cgitb.enable()
import MySQLdbconn=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>
"""


二、运行截图

wKioL1SGu8WAqcUVAAD3dHLRbOw210.jpg

wKioL1SGu9fghd5PAADtRNGM4RI193.jpg

wKioL1SGu-OjxOm8AADKVDj7zvQ555.jpg

wKiom1SGu1ihjEjWAAC6zDmKTFw678.jpg

wKioL1SGvKvSmb2jAADNb2KBbsw350.jpg