usage:
$ python guestbook.py
(本机访问"http://127.0.0.1:8000")
功能实现:
网页中填写用户名,评论,会按照时间先后呈现出来
主要做了以下工作:
- 确定布局,编写必要页面
- 编写保存提取主程序,并验证
- 引入flask必要方法,展示页面模板
- 设置过滤器转换一些字符
- 安全检测
- 成品
编写必要页面"index.html", 相应的"main.css"
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>留言板</title>
</head>
<body>
<h1>留言板</h1>
<form action="/post" method="post">
<p>请留言</p>
<table>
<tr>
<th>名字</th>
<td>
<input type="text" size="20" name="name"/>
</td>
</tr>
<tr>
<th>请留言</th>
<td>
<textarea rows="5" cols="50" name="comment"></textarea>
</td>
</tr>
</table>
<p><button type="submit">提交</button></p>
</form>
<hr />
<div class="entries-area">
<h2>留言记录</h2>
<h3>游客 的留言(2017/08/8):</h3>
<p>留言内容留言内容</p>
<h2>留言记录</h2>
<h3>游客 的留言(2017/08/8):</h3>
<p>留言内容留言内容</p>
</div>
</body>
</html>
编写主要程序"save_data"和"load_data"
save_data
执行保存任务:
- 先检测数据库中有没有列表,没有的话定义为空,有的话加载出来;
- 将新的参数保存进去(插入到最前面便于展示)
- 保存到数据库中
import shelve
DATA_FILE = 'guestbook.dat'
def save_data(name, comment, create_at):
database = shelve.open(DATA_FILE)
if greeting_list not in database:
greeting_list = []
else:
greeting_list = database['greeting_list']
greeting_list.insert(0, \
{'name':name, 'comment':comment,'create_at: create_at'})
database['greeting_list'] = greeting_list
database.close()
load_data()
提取数据
- 用
get
方法获取datbase中的数据,如果没有默认返回一个空列表 - 返回
greeting_list
列表
def load_data():
database = shelve.open(DATA_FILE)
greeting_list = database.get('greeting_list', [])
database.close()
return greeting_list
引入flask
必要方法,实现视图显示
#!/usr/bin/env python3
# coding:utf-8
import shelve
from flask import Flask, request, render_template, redirect, escape, Markup
application = Flask(__name__)
def save_data():
...
def load_data():
...
@application.route('/')
def index():
greeting_list = load_data()
return render_template('index.html', greeting_list=greeting_list)
if __name__ == '__main__':
application.run('127.0.0.1', 8000, debug=True)
创建post
函数获取表单数据
- "index.html"中表单定义的action="/post"
- 从表单获取数据
request.form.get()
- 添加时间
datetime.now()
from datetime import datetime
@application.route('/post', methods=['POST'])
def post():
name = request.form.get('name')
comment = request.form.get('comment')
create_at = datetime.now() # 提交时间
save_data(name, comment,create_at)
redirect('/')
修改"index.html"显示留言的部分
添加模板语言,模板内使用一种特殊的描述方式,即模板语言.
jinja2模板可以通过{%...%}的形式使用if或for等控制语句,植入有模板变量的部分用{{...}}的形式描述.比如用"for"循环需要有{%for...%}{%endfor%}
<div class="entries-area">
<h2>留言记录</h2>
{% for greeting in greeting_list%}
<h3>{{greeting.name}} 的留言{{greeting.create_at}}:</h3>
<p>{{greeting.comment}}</p>
{% endfor %}
</div>
调整模板的输出
- 表单提交时,换行输入会被忽略,无法正常显示
- 显示时间格式化
添加模板过滤器
@application.template_filter('nl2br')
def nl2br_filter(s):
return escape(s).replace('\n', Markup('<br />'))
@application.template_filter('datetime_fmt')
def datetime_fmt_filter(dt):
return dt.strftime('%Y%m%d %H%M%S')
验证跨站脚本攻击
跨站脚本攻击(Cross Site Scripting, XSS)用户能在某些能以HTML形式显示输入内容的应用中,故意植入一些攻击性的脚本
jiaja2模板在翻译字符时已忽略HTML的"<"和">"符号,因此能够成功避免XSS攻击
验证
<script>alert('NG')</script>
网友评论