python练习六—简单的论坛
进行简单的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练习六—简单的论坛的更多相关文章
- 孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5
孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5并学习权限设置 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十二天. 今天继续学习mongo ...
- 孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4
孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十一天. 今天继续学习mongoDB的简单操作 ...
- 孤荷凌寒自学python第六十四天学习mongoDB的基本操作并进行简单封装3
孤荷凌寒自学python第六十四天学习mongoDB的基本操作并进行简单封装3 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十天. 今天继续学习mongoDB的简单操作, ...
- 孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2
孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第九天. 今天继续学习mongoDB的简单操作, ...
- 孤荷凌寒自学python第六十二天学习mongoDB的基本操作并进行简单封装1
孤荷凌寒自学python第六十二天学习mongoDB的基本操作并进行简单封装1 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第八天. 今天开始学习mongoDB的简单操作, ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- 简学Python第六章__class面向对象编程与异常处理
Python第六章__class面向对象编程与异常处理 欢迎加入Linux_Python学习群 群号:478616847 目录: 面向对象的程序设计 类和对象 封装 继承与派生 多态与多态性 特性p ...
- 孤荷凌寒自学python第六十天在windows10上搭建本地Mongodb数据服务
孤荷凌寒自学python第六十天在windows10上找搭建本地Mongodb数据服务 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第六天.成功在本地搭建了windows ...
- Python正则表达式的简单应用和示例演示
前一阵子小编给大家连续分享了十篇关于Python正则表达式基础的文章,感兴趣的小伙伴可以点击链接进去查看.今天小编给大家分享的是Python正则表达式的简单应用和示例演示,将前面学习的Python正则 ...
随机推荐
- 解决.Net Core跨域问题
什么是跨域?浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域 跨域的几种情况 1.端口和协议的不同,只能通过后台来解决 2.localhost和127.0.0.1虽然 ...
- vb.net WIN32API 获取listview的值
Public Class Form1 Public Const LVM_FIRST As Short = &H1000S Public Const LVM_GETITEMCOUNT As In ...
- h5上传视频文件
从一开始我就掉坑里了,<input type="file" style="display: block;" id="img-upload&quo ...
- 扁平化promise调用链(译)
这是对Flattened Promise Chains的翻译,水平有限请见谅^ ^. Promises对于解决复杂异步请求与响应问题堪称伟大.AngularJS提供了$q和$http来实现它:还有很多 ...
- Java File类与文件IO流总结
1.File类 File类被定义为“文件和目录路径名的抽象表示形式”,这是因为File类既可以表示“文件”也可以表示“目录”,他们都通过对应的路径来描述.通过构造函数创建一个File类对象,则该对象就 ...
- 211806385 黄存慧 https://www.cnblogs.com/huangch/ https://github.com/HuangCh327
211806385 黄存慧 https://www.cnblogs.com/huangch/ https://github.com/HuangCh327
- HTML5元素标记释义
HTML5元素标记释义 标记 类型 意义 介绍 文件标记 <html> ● 根文件标记 让浏览器知道这是HTML 文件 META标记 <head> ● 开头 提供文件整体信息 ...
- Oracle 树操作、递归查询(select…start with…connect by…prior)
一.Oracle中start with…connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是:select … from tablename start ...
- Dubbo 源码分析 - 服务引用
1. 简介 在上一篇文章中,我详细的分析了服务导出的原理.本篇文章我们趁热打铁,继续分析服务引用的原理.在 Dubbo 中,我们可以通过两种方式引用远程服务.第一种是使用服务直联的方式引用服务,第二种 ...
- 【转】vim 的各种用法,很实用哦,都是本人是在工作中学习和总结的
原文地址https://www.cnblogs.com/lxwphp/p/7738356.html (一)初级个性化配置你的vim 1.vim是什么? vim是Vi IMproved,是编辑器Vi的一 ...