【Python搞搞轻量博客】第三发 开发无数据库留言板
Hi,大家好,我又回来了。
今天我要写一个无需数据,来实现一个简易的留言板。
准备
- 留言有用户名,标题,内容,时间
- 多用户
前端与后端数据提交
通常Web应用在前端和后端的数据交互少不了Get和Post这两种HTTP方法。
那么,我们如何通过传递参数的方式来获取数据呢?
比如,/get/?name=xeanyu&age=10 其中的数据为name=xeanyu 和 age = 10
from flask import Flask,request
app = Flask(__name__)
@app.route('/get/',methods=['GET'])
def index():
name = request.args.get('name')
age = request.args.get('age')
print("name: %s \nage: %s " % (name,age))
return 'OK'
if __name__ == '__main__':
app.run(debug=True)
第一行: 我们导入了 request,利用它来获取前端传递给后端的数据
第六 行: 获取参数,name的值,如果name没有传递参数,不会报错,而是返回None
第七行: 获取参数,age的值,同上
我们看下控制台
成功获取get方法所传递的值。
然后我再来使用Post方法来获取数据。
如果使用Post来获取参数,我们就需要使用html来传递到后端。
from flask import Flask,request,render_template
app = Flask(__name__)
@app.route('/get/',methods=['GET','POST'])
def index():
if request.method == 'GET':
return render_template('index.html')
if request.method == 'POST':
name = request.form.get('name')
age = request.form.get('age')
print("POST 方法 \nname: %s \nage: %s" % (name,age))
return '已经获取数据'
if __name__ == '__main__':
app.run(debug=True)
然后我们来看HTML代码
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>POST方法</title>
</head>
<body>
<center><h1>Post方法</h1></center>
<center>
<form action="{{ url_for('index') }}" method="POST">
姓名: <input type="text" name="name"><br>
年龄: <input type="text" name="age"><br>
<button>提交</button>
</form>
</center>
</body>
</html>
可以看到,在 第十二行 中, form表单 中的action的值是我们用 url_for()函数获取路由index的URL,然后method所使用的http方法为 POST
然后来看app.py主应用的代码
第4行: 其中methods添加POST方法
第6 – 15行中: 利用if判断所访问的方法,如果是get,就是直接用浏览器访问,则渲染一个模板,如果是POST方法,就使用 request.form.get来获取 模板中表单的两个输入的值。
可以看到,这是GET方法的访问,所给我们渲染的模板。很简陋蛤
然后我们输入年龄和姓名,再来看控制台。
可以看到,成功获取了表单数据。现在,我们学到的知识,已经够我们写一个无需数据库的留言板了。
开始写留言板
from flask import Flask,request,render_template,redirect,url_for
import time
app = Flask(__name__)
users = [] # 这里存放所有的留言
@app.route('/say/',methods=['GET','POST'])
def index():
if request.method == 'GET':
return render_template('index.html',says=users)
else:
title = request.form.get('say_title')
text = request.form.get('say')
user = request.form.get('say_user')
date = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
users.append({"title": title,
"text":text,
"user":user,
"date": date})
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True,)
还有模板代码
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>留言板</title>
</head>
<body>
<center><h1>留言</h1></center>
<center>
<form action="{{ url_for('index') }}" method="POST">
用户名: <input type="text" name="say_user"><br>
留言标题: <input type="text" name="say_title"><br>
留言内容: <input type="text" name="say"><br>
<button>提交留言</button>
</form>
</center>
<center>
<table border="2">
<thead>
<tr>
<th>标题</th>
<th>内容</th>
<th>用户</th>
<th>留言时间</th>
</tr>
</thead>
<tbody>
{% for say in says %}
<tr>
<td>{{ say['title'] }}</td>
<td>{{ say['text'] }}</td>
<td>{{ say['user'] }}</td>
<td>{{ say['date'] }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</center>
</body>
</html>
主应用app.py中
大致的思路是,创建一个留言列表。然后有Get方法去渲染模板,在模板中输入值,再去用POST提交给路由,路由将数据定义成为一个字典。
字典是这样的:
- title => 用户输入的标题
- text => 用户输入的内容
- user => 用户名
- date => 时间,使用time模块,实时获取
多说无益,我们来运行测试一下。
每次提交POST表单数据,视图函数添加到 users列表 以后,就会又跳转到 get 方式的页面。
代码可见主应用 app.py中 12 – 23行代码中,第23行代码 使用redirect又跳转到了留言页面。
这个留言板弊端很多,比如一旦重启应用,就会丢失所有的用户留言,你可以使用json,进行序列化储存。或者其他方式写入到文件。
弊端如下:
- 数据无法持久化储存
- 没有进行数据审核
- html如果内容较长,显示就会很难看。
- 还有非常多的弊端,自己去脑补吧大家。
Ok,如果大家有什么问题请加微信互相交流。
转载请注明: 静觅 » 【Python搞搞轻量博客】第三发 开发无数据库留言板