由于最近学习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,如需转载请自行联系原作者




