Python基础教程__项目(公告板)

由于最近学习Python,从最基础的Python基础教程学起,其中最后的十个项目还是很不错的。个人认为。本人新手,如有错误,还请指教。

书上用的是PostgreSQL,这里用的是MySQL。由于这是一个CGI项目。所以事先需要准备一个可以运行CGI脚本的试验环境。

本次用的是Apache运行cgi。配置网上很多。

其次需要创建一个数据表:

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`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8

一个简单的公告板,主要功能:显示所有公告、查看单个公告、编辑公告、保存公告、删除公告(个人增加的)。根据这些功能可以创建五个对应的脚本:main.cgi、view.cgi、edit.cgi、save.cgi、delete.cgi

一、下面废话省略,直接上代码和运行图片:

1、main.cgi

#!/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>
    <table width="324" height="30" border="0" cellspacing="0">
  """

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

#!/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

#!/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

#!/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

#!/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>
"""

二、运行截图

时间: 2024-10-06 23:02:28

Python基础教程__项目(公告板)的相关文章

python基础教程笔记-项目2-画幅好画-Day1

今天开始看项目二:画幅好画 项目中会用到图形生成包ReportLab,因此首先装好这个包:easy_install reportlab 从书中可以了解到,这个包主要用于作图. 比如说写字.画线等.执行代码: from reportlab.lib import colors from reportlab.graphics.shapes import Drawing,String,PolyLine from reportlab.graphics import renderPDF d = Drawin

python基础教程笔记-项目2-画幅好画-Day2

本项目剩下部分主要使用量urllib和LinePlot. 什么是urllib? urllib模块提供的上层接口,使我们可以像读取本地文件一样读取www和ftp上的数据. 看代码: import urllib print urllib.urlopen('http://www.baidu.com').read() 执行效果: 重点需要注意的是urlopen函数: 关于urlopen的一些使用实例可参考链接: http://blog.csdn.net/leer168/article/details/8

python基础教程笔记-项目1-即时标记-Day3

昨天实现了简单的txt转html,今天更深入一步. 主要了解下带星号的参数.getattr函数和callable函数 先看Handler类: class Handler: def callback(self, prefix, name, *args): method = getattr(self, prefix+name, None) if callable(method): return method(*args) def start(self, name): self.callback('s

python基础教程笔记-项目1-即时标记-Day2

昨天主要了解了下生成器,用文档测下lines: def lines(file): for line in file: yield line yield '\n' for i in lines(sys.stdin): if i: print i print '---' 测试文档test_input.txt: hello how are you how do you do fine 执行: 输出结果test_output.txt: hello --- --- how are you --- how

python基础教程笔记-项目1-即时标记-Day4

今天主要看下re.sub函数和Handler类的sub函数 先看下re.sub函数 re.sub共有5个参数,不过一般写前三个就好了,即pattern,repl和string pattern表示正则中的模式字符串,repl可以是字符串,也可以是函数.string为要进行替换的字符串 先看一段代码: import re def Num2A(match): return 'A' a = re.sub(r'(\d+)', Num2A, 'he123he') print a a = re.sub(r'(

《Python基础教程(第3版)》PDF高清版

Python基础教程(第3版) 链接: https://pan.baidu.com/s/1_sXv7pUXGJuG5Nd75_iDHA 提取码: 9b7q ? 内容简介  · · · · · · 本书包括Python程序设计的方方面面:首先从Python的安装开始,随后介绍了Python的基础知识和基本概念,包括列表.元组.字符串.字典以及各种语句:然后循序渐进地介绍了一些相对高级的主题,包括抽象.异常.魔法方法.属性.迭代器:此后探讨了如何将Python与数据库.网络.C语言等工具结合使用,从

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

Python基础教程(第十章 自带电池)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5459376.html______ Created on Marlowes 现在已经介绍了Python语言的大部分基础知识.Python语言的核心非常强大,同时还提供了更多值得一试的工具.Python的标准安装中还包括一组模块,称为标准库(standard library).之前已经介绍了一些模块(例如math和cmath,其中包

python基础教程_学习笔记5:字符串

字符串 基本字符串操作 字符串也是序列,因此序列的基本操作(索引.分片.连接.乘法.长度.求最大值和最小值.成员资格)对字符串同样适用: 索引 >>> 'a_string'[0] 'a' 长度 >>> len('a_string') 8 求最大值 >>> max('a_string') 't' 求最小值 >>> min('a_string') '_' 乘法 >>> 'a_string'*2 'a_stringa_st