进行简单的web应用之后,接下来就应该学习python连接数据库,这个练习就是在上个练习的基础上将信息保存到数据库,这个联系也没有什么特别的,有之前java web的经验的话,很好理解,主要还是一个MySQLdb的学习。代码如下(创建数据库就忽略了吧):

从数据库查询message以列表的形式显示main.py

#! /usr/bin/env python
# -*- coding=utf-8 -*- import cgitb
import MySQLdb # 声明文本格式
print 'Content-type:text/html\n' cgitb.enable() # 连接数据库
conn = MySQLdb.connect(user='root', db='test')
curs = conn.cursor() print """
<html>
<head>
<title>主页</title>
</head>
<body>
<h1>论坛帖子列表</h1>
""" # 将数据库中记录读取到dic
curs.execute('select * from messages')
# mysql没有这样的方法
# rows = curs.dictfetchall()
# 获取表的列的名称
names = [d[0] for d in curs.description]
print names
rows = [dict(zip(names, row)) for row in curs.fetchall()]
print rows # 主贴
toplevel = []
# 回复帖
children = {} # 区分出主贴和回复帖
for row in rows:
parent_id = row['reply_to']
if parent_id is None:
toplevel.append(row)
else:
children.setdefault(parent_id, []).append(row) # 格式化帖子列表
def format(row):
print '<p><a href="view.py?id=%(id)s">%(subject)s </a></p>'% row
try:
kids = children[row['id']]
except KeyError:
pass
else:
# 递归格式化帖子的子贴(回复)
print '<blockquote>'
for kid in kids:
format(kid)
print '</blockquote>'
print '<p>' # 调用format格式化帖子
for row in toplevel:
format(row) print """
</p>
<hr />
<p><a href="edit.py">发帖</a></p>
</bofy>
</html>
"""

查看一个具体帖子的详细内容view.py

#! /usr/bin/env python
# -*- coding=utf-8 -*- import cgitb
import sys
import cgi
import MySQLdb # 声明文本格式
print 'Content-type:text/html\n' cgitb.enable() # 接受参数
form = cgi.FieldStorage()
id = form.getvalue('id') try:
id = int(id)
except :
print 'Invalid id'
sys.exit() # 连接数据库
conn = MySQLdb.connect(user='root', db='test')
curs = conn.cursor() print """
<html>
<head>
<title>View message</title>
</head>
<body>
<h1>View Message</h1>
""" # 将数据库中记录读取到dic
curs.execute('select * from messages where id = %i' % id)
# mysql没有这样的方法
# rows = curs.dictfetchall()
# 获取表的列的名称
names = [d[0] for d in curs.description]
#print names
rows = [dict(zip(names, row)) for row in curs.fetchall()]
#print rows # 如果该id查询不到数据,说明不存在该id
if not rows:
print 'Unknow message id'
sys.exit() # 获取返回的第一条数据
row = rows[0] print """
<p>
<b> Subject: </b>%(subject)s <br />
<b> sender: </b>%(sender)s <br />
<pre>%(text)s</pre>
</p>
<hr />
<a href="main.py">back to main page</a>>
|
<a href="edit.py?reply_to=%(id)s"> reply</a>
</bofy>
</html>
""" % row

查看完帖子之后回帖,edit.py

#! /usr/bin/env python
# -*- coding=utf-8 -*- import cgitb
import sys
import cgi
import MySQLdb # 声明文本格式
print 'Content-type:text/html\n' cgitb.enable() # 接受参数
form = cgi.FieldStorage()
reply_to = form.getvalue('reply_to') # 连接数据库
conn = MySQLdb.connect(user='root', db='test')
curs = conn.cursor() print """
<html>
<head>
<title>View message</title>
</head>
<body>
<h1>View Message</h1>
<form action="save.py" method="POST">
""" subject = ''
if reply_to is not None:
print "<input type='hidden' name='reply_to' value='%s' />" % reply_to
curs.execute('select * from messages where id=%s' % reply_to)
subject = curs.fetchone()[1]
print subject
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.py'>Back to the main page</a>'
</body>
</html>
""" % subject

编辑完帖子的时候,提交save.py

#!/usr/bin/python
# -*- coding=utf-8 -*- print 'Content-type: text/html\n' import cgitb; cgitb.enable() # 将单引号转义,在使用insert语句的时候字符串就不需要添加引号
def quote(string):
if string:
return string.replace("'", "\\'")
else:
return string import MySQLdb
conn = MySQLdb.connect(db='test', user='root')
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 'Please supply sender, subject, and text'
sys.exit() if reply_to is not None:
query = """
insert into messages(reply_to, sender, subject, text)
values(%i, '%s', '%s', '%s')""" % (int(reply_to), sender, subject, text)
else:
query = """
insert into messages(sender, subject, text)
values('%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.py'>Back to the main page</a>
</body>
</html>s
"""

完整代码

http://pan.baidu.com/s/1gfbLDtx

python练习六—简单的论坛的更多相关文章

  1. 孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5

    孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5并学习权限设置 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十二天. 今天继续学习mongo ...

  2. 孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4

    孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十一天. 今天继续学习mongoDB的简单操作 ...

  3. 孤荷凌寒自学python第六十四天学习mongoDB的基本操作并进行简单封装3

    孤荷凌寒自学python第六十四天学习mongoDB的基本操作并进行简单封装3 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十天. 今天继续学习mongoDB的简单操作, ...

  4. 孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2

    孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第九天. 今天继续学习mongoDB的简单操作, ...

  5. 孤荷凌寒自学python第六十二天学习mongoDB的基本操作并进行简单封装1

    孤荷凌寒自学python第六十二天学习mongoDB的基本操作并进行简单封装1 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第八天. 今天开始学习mongoDB的简单操作, ...

  6. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  7. 简学Python第六章__class面向对象编程与异常处理

    Python第六章__class面向对象编程与异常处理 欢迎加入Linux_Python学习群  群号:478616847 目录: 面向对象的程序设计 类和对象 封装 继承与派生 多态与多态性 特性p ...

  8. 孤荷凌寒自学python第六十天在windows10上搭建本地Mongodb数据服务

     孤荷凌寒自学python第六十天在windows10上找搭建本地Mongodb数据服务 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第六天.成功在本地搭建了windows ...

  9. Python正则表达式的简单应用和示例演示

    前一阵子小编给大家连续分享了十篇关于Python正则表达式基础的文章,感兴趣的小伙伴可以点击链接进去查看.今天小编给大家分享的是Python正则表达式的简单应用和示例演示,将前面学习的Python正则 ...

随机推荐

  1. 今天我给你们推荐一本书《Linux就该这么学》!!!

    本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材,目前是国内最值得去读的Linux教材,也是最有价值 ...

  2. Notes on Distributed System -- Distributed Hash Table Based On Chord

    task: 基于Chord实现一个Hash Table 我负责写Node,队友写SuperNode和Client.总体参考paper[Stoica et al., 2001]上的伪代码 FindSuc ...

  3. [转]找到MySQL发生swap的原因

    背景: 最近遇到了一个郁闷的问题:明明OS还有大量的空闲内存,可是却发生了SWAP,百思不得其解.先看下SWAP是干嘛的,了解下它的背景知识.在Linux下,SWAP的作用类似Windows系统下的“ ...

  4. Solaris:你好奇的十件事

    想想你周围的人,看看他们正在使用的操作系统.绝大部分人的电脑都在用主流操作系统:Windows,MacOS,甚至是Ubuntu.当说到Solaris,Unix和BSD的时候,其他人还以为你说鸟语呢.除 ...

  5. 简单的JavaScript图像延迟加载库Echo.js

    插件描述:和 Lazy Load 一样,Echo.js 也是一个用于图像延迟加载 JavaScript.不同的是 Lazy Load 是基于 jQuery 的插件,而 Echo.js 不依赖于 jQu ...

  6. data science学习笔记1

    Mutiple Plots on One Graph plt.plot(x, norm.pdf(x)) plt.plot(x, norm.pdf(x, 1.0, 0.2)) #1.0 = mean, ...

  7. noip第31课资料

  8. python学习,excel操作之xlrd模块常用操作

    import xlrd ##工作表## #打开excel f = xlrd.open_workbook("test.xlsx") file = f.sheet_by_name(&q ...

  9. jackson 用法总结

    1.序列化与反序列化封装 private static final Logger logger = LoggerFactory.getLogger(JsonUtil.class); /** * Obj ...

  10. jenkins:一个jenkins项目远程触发另一个jenkins项目构建配置

    很多时候,我们会有这样的应用场景:一个jenkins上的项目构建后,需要远程触发另一台机子上的jenkins中某个项目的构建,可以通过Parameterized Remote Trigger Conf ...