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

时间: 2024-10-29 01:10:20

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

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

孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5并学习权限设置 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十二天. 今天继续学习mongoDB的简单操作,并继续对一些可能反复经常使用的操作进行简单的封装.同时通过搜索了解了如何对本地Mongo数据库进行权限设置(没有实践本地数据库的用户权限设置.) 按个人规划,今天是初步了解学习MongoDb数据库的最后一个学习日,后续将在真正使用此数据库时,再对其进行深入研究. 一.今天完成了两个可

python之simplejson,Python版的简单、 快速、 可扩展 JSON 编码器/解码器

python之simplejson,Python版的简单. 快速. 可扩展 JSON 编码器/解码器 simplejson Python版的简单. 快速. 可扩展 JSON 编码器/解码器 编码基本的 Python 对象层次结构: import simplejson as json print json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) print json.dumps("\"foo\bar") print json

如何用python写一个简单的find命令

对一个运维来说可能会经常去查找目录下的一些文件是否存在,最常用的就是find命令,它不仅可以查找文件也可以查找目录,find命令用法 查找文件 [[email protected] opt]# find /usr/ -type f -name df /usr/bin/df 查找目录 [[email protected] opt]# find /usr/ -type d -name python /usr/share/gcc-4.8.2/python 现在就讲一些如何用python实现这个简单功能

Python中的简单计算

Python中的简单计算 (1)基本的加减乘除 >>> 2 + 2 4 >>> 50 - 5*6 20 >>> (50 - 5*6) / 4 5.0 >>> 8 / 5  1.6 (2)除法总是会返回一个浮点数,想要返回整数,需要用"//"来表示(floor division),另外,可以用"%"进行取余操作 >>> 17 / 3  # classic division ret

《Python入门》第一个Python Web程序——简单的Web服务器

上一篇讲了<Python入门>Windows 7下Python Web开发环境搭建笔记,接下来讲一下Python语言Web服务的具体实现:第一个Python Web程序--简单的Web服务器. 与其它Web后端语言不同,Python语言需要自己编写Web服务器. 如果你使用一些现有的框架的话,可以省略这一步: 如果你使用Python CGI编程的话,也可以省略这一步: 用Python建立最简单的web服务器 利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录

python中一个简单的webserver

python中一个简单的webserver 2013-02-24 15:37:49 分类: Python/Ruby 支持多线程的webserver 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/usr/bin/python from SocketServer import ThreadingMixIn from BaseHTTPServer import HTTPServer,BaseHTTPRequestHandler cla

Python mongoDB 的简单操作

#!/usr/bin/env python # coding:utf-8 # Filename:mongodb.py from pymongo import MongoClient,ASCENDING,DESCENDING import datetime # connection with mongoclient client=MongoClient() # getting a database db=client.test # getting a collection collection=d

【Python】一个简单的例子

问题描述: Python基础篇 参考资料: (1)http://www.cnblogs.com/octobershiner/archive/2012/12/04/2801670.html (2)http://www.cnblogs.com/itech/archive/2010/06/20/1760345.html 例子: 求解Fibonacci glb_var.py gl_count=1 path.py # coding:utf-8 ''' Created on 2014-4-28 @autho

使用Python实现一个简单的项目监控

在公司里做的一个接口系统,主要是对接第三方的系统接口,所以,这个系统里会和很多其他公司的项目交互.随之而来一个很蛋疼的问题,这么多公司的接口,不同公司接口的稳定性差别很大,访问量大的时候,有的不怎么行的接口就各种出错了. 这个接口系统刚刚开发不久,整个系统中,处于比较边缘的位置,不像其他项目,有日志库,还有短信告警,一旦出问题,很多情况下都是用户反馈回来,所以,我的想法是,拿起python,为这个项目写一个监控.如果在调用某个第三方接口的过程中,大量出错了,说明这个接口有有问题了,就可以更快的采