进行简单的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. 软件测试---测试模型(V、W、H)

    一.V测试模型 1.V模型示意图: 单元测试:又叫模块测试,针对软件设计中的最小单位—>程序模块 集成测试:又叫组装测试,通常在单元测试的基础上,将所有程序模块进行有序.递增测试. 系统测试:把 ...

  2. 第一次OO总结

    作业1——多项式加减法 看到这个名字就开始瑟瑟发抖了,毕竟一年前用C语言让我写这么一个程序都很头疼,什么堆栈啊还有结构都稀里糊涂的,更别说用一个完全没接触过的语言来完成最简单的一次作业.像我这样越老心 ...

  3. Django之路

    备注:本套笔记内容来源于互联网,只做学习使用,如有侵权请联系本笔记作者. 资料内容 Django之路(一)——什么是Web开发 Django之路(二)——Django初识 Django之路(三)——U ...

  4. JavaScript基础视频教程总结(051-060章)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. 使用 vs code 搭建vue项目(一)

    1. 配置环境 1.1. 安装nodejs,下载地址:https://nodejs.org/en/download/. 步骤-..安装完成后,输入node-v,提示如下,则安装完成. 1.2. 安装v ...

  6. 零基础Windows + JAVA(jdk)环境搭建以及eclipse安装和使用

    关于java的环境搭建其实网上有很多种,下面小编就自己来操作一下吧~ java的环境搭建最主要的就是jdk的安装及环境变量设置,好了,来看看安装步骤: 一.JDK的下载与安装(java安装包)  JD ...

  7. python学习,excel操作之xlsxwriter常用操作

    from datetime import datetime import xlsxwriter #打开文件 workbook = xlsxwriter.Workbook('Expenses03.xls ...

  8. 算法第四版jar包下载地址

    算法第四版jar包下载地址:https://algs4.cs.princeton.edu/code/

  9. Hashtable与Dictionary比较

    项目需要存储Tcp连接对象,考虑使用Hashtable或者Dictionary存储.Hashtable在查询方面有优势,Dictionary在确定类型下不需要拆箱与装箱有优势.于是,写了个demo对两 ...

  10. SpringMVC拦截静态资源的处理办法

    SpringMVC拦截静态资源导致  JS  CSS  无法加载  可以在配置文件中加入以下代码 <mvc:resources location="/statices/" m ...