声明:以下内容是本人大二在某公司实习时学习python做的一个小练习!代码风格比较差,不怎么优美!还请大家指教!
一.题目与背景知识说明
(1)题目描述
学习flask,并编写一个基于flask技术的留言板程序。留言板需求较为简单,用户可以在页面输入昵称和邮箱,输入留言内容(至少50字,上限500字),提交后则在页面下方显示最新的十条留言信息
(2)flask简介
flask是一个轻量级的Web应用框架,使用Python编写。基于WerkzeugWSGI工具箱和Jinja2模板引擎。Flask使用BSD授权。Flask也被称为 “microframework” ,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入这些功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。
二.需求分析
1.网络留言板,又称为留言簿或留言本,是目前网站中使用较广泛的一种与用户沟通、交流的方式。通过留言板,可收集来自用户的意见或需求信息,并可作出相应的回复,从而实现网站与客户之间及不同客户之间的交流与沟通。通过留言板用户和访问者在Internet上实现信息的快速传递,提高办事效率。因此留言板已成为现代人沟通和获取消息的重要组成部分。开发一个留言系统,首先需要确定留言的功能是什么,也就是用户想要留言版所拥有的作用。用户使用留言是按照一定的流程来进行的:用户输入姓名进入留言,可以就某个话题展开讨论,通过留言功能给个人或者网站提出自己的意见。
三.程序设计思路
本程序基于flask的web框架,用python实现了留言板功能,留言数据存储在sqlite数据库上。并且用bootstrap制作了较为简洁美观的界面。下面简要说明下具体实现:
(1)具体函数方法:
def connect_db():快速连接到指定数据库的方法
def init_db():初始化数据库
def show_entries():输出函数,会将条目作为字典传递给 show_entries.html 模板,并返回之后的渲染结果
def add_entry():用户添加新的留言信息函数,并只响应 POST 请求,表单显示在 show_entries.而且对输入的字数做了限制在50字到500字范围,不在这个范围就不提交到数据库.
def login():登录函数
def logout():退出登录函数
(2)数据库
本次实验采用的是sqlite数据库,下面是数据库中建立的存储留言信息的table ,如图所示:
id是自增的,用来做主键,比如显示最新的十条留言信息就是用id值实现.
四.程序运行说明
首先,打开浏览器输入程序的地址,显示界面如下图:
点击输入留言信息,运行图片如下:
显示最新的留言信息如下:(最新留言名字加大显示)
五.程序清单(附有注释)
# -*- coding: utf-8 -*-
from __future__ import with_statement
import sqlite3
from flask import Flask,request,session,g,redirect,url_for,\
abort,render_template,flash
from contextlib import closing
# configuration
DATABASE = '/home/feng/project/flaskr/flaskr.db'#数据库存储路径
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default'
#create our little application :)
app = Flask(__name__)
app.config.from_object(__name__)
app.config.from_envvar('FLASKR_SETTINGS', silent=True)
def connect_db():#快速连接到指定数据库的方法
return sqlite3.connect(app.config['DATABASE'])
def init_db():#初始化数据库
with closing(connect_db()) as db:
with app.open_resource('schema.sql') as f:
db.cursor().executescript(f.read())
db.commit()
@app.before_request
def before_request():
g.db = connect_db()
@app.teardown_request
def teardown_request(exception):
g.db.close()
@app.route('/')
def show_entries():#输出函数,会将条目作为字典传递给 show_entries.html 模板,并返回之后的渲染结果
cur = g.db.execute('select name,email,text from entries order by id desc limit 10')
entries = [dict(name=row[0], email=row[1], text=row[2]) for row in cur.fetchall()]
return render_template('show_entries.html', entries=entries)
@app.route('/add', methods=['POST'])
def add_entry():#用户添加新的留言信息函数,并只响应 POST 请求,表单显示在 show_entries
if not session.get('logged_in'):
abort(401)
if len(request.form['text']) >50 and len(request.form['text'])<500:#实现控制字数在50到500范围内
g.db.execute('insert into entries (name,email,text) values (?,?,?)',
[request.form['name'],request.form['email'], request.form['text']])
g.db.commit()
flash('New entry was successfully posted')
else:
flash('The input range must be between 50 and 500 characters ')#如果留言信息不在范围内作出提示
return redirect(url_for('show_entries'))
@app.route('/login', methods=['GET', 'POST'])
def login():#登入函数
error = None
if request.method == 'POST':
if request.form['username'] != app.config['USERNAME']:
error = 'name error'
elif request.form['password'] != app.config['PASSWORD']:
error = 'password error'
else:
session['logged_in'] = True
flash('log in')
return redirect(url_for('show_entries'))
return render_template('login.html', error=error)
@app.route('/logout')
def logout():#退出登录函数
session.pop('logged_in', None)
flash('log out')
return redirect(url_for('show_entries'))
if __name__ == '__main__':
init_db()
app.run(debug=True)
六、小结(收获和体会)
由于出学python,所以几天时间搞这个还是比较大压力的!还有就是之前看flask觉得很吃力,现在虽然做出东西来,但是心里还是没有底子的感觉!不过就是觉得bootstrap很方便,很好用!但是时间关系,就做的很一般。只能说希望在以后的实践中逐渐提高自己的水平吧,尽快摆脱菜鸟身份!