用两个字形容Flask[维基百科] : 优雅
用 优雅 来形容这个工具再合适不过了,轻巧、简单、安全、扩展性强、社区强大,这些都是我喜欢它的原因。
Flask 官方文档: Flask 中文
Linux 部署 flask 项目 :Linux 部署 flask 项目
Flask 框架部署参考 : Flask 框架
新项目中有两个目录:
static: HTTP直接访问文件的文件夹(如CSS、js);
templates: 包含项目的 Jinja2[官方文档]模板,HTML 文件以及 JS 文件。
表单
以下是一个提交表单:
/login 路由:
@app.route('/login', methods=['POST', 'GET'])
def login():
# 当请求方式是 POST
if request.method == 'POST':
#print(request.form.get("user"))
if request.form['user'] == 'admin':
return 'Admin login successfully!'
else:
# return 'No such user!'
title = request.args.get('title', request.form['user'])
return render_template('login.html', title=title)
# 当请求方式是 GET
elif request.method == 'GET':
title = request.args.get('title', 'comsters')
return render_template('login.html', title=title)
login 表单 (login.html):
{% extends "layout.html" %}
{% block body %}
<form name="login" action="/login" method="post">
Hello {{ title }}, please login by:
<input type="text" name="user">
</form>
{% endblock %}
当 flask 项目运行时,初次访问请求方式是 GET ,所以 title 的值为 comsters , 当表单提交时,请求方式是 POST。
路由中 request 的 method 有四种:POST、GET、DELETE、PUT 。
Session
from flask import Flask, render_template,request, session, url_for, redirect
app = Flask(__name__)
@app.route('/login', methods=['POST', 'GET'])
def login():
# 当请求方式是 POST
if request.method == 'POST':
#print(request.form.get("user"))
if request.form['user'] == 'admin':
session['user'] = request.form['user']
return 'Admin login successfully!'
# return redirect(url_for('login'))
else:
return 'No such user!'
# session['user'] = request.form['user']
# title = request.args.get('title', request.form['user'])
# return render_template('login.html', title=title)
if 'user' in session:
return 'Hello %s!' % session['user']
# 当请求方式是 GET
else:
title = request.args.get('title', 'comsters')
return render_template('login.html', title=title)
@app.route('/logout')
def logout():
session.pop('user', None)
return redirect(url_for('login'))
app.secret_key = '123sdf'
if __name__ == '__main__':
app.run(debug=True, port=8777)
使用 Session 时一定要设置秘钥( secret_key )进行加密。使用 session['user'] 调用。
构造响应头
from flask import Flask, make_response, render_template,request, session, url_for, redirect
app = Flask(__name__)
@app.route('/login', methods=['POST', 'GET'])
def login():
# 当请求方式是 POST
if request.method == 'POST':
#print(request.form.get("user"))
if request.form['user'] == 'admin':
session['user'] = request.form['user']
return 'Admin login successfully!'
# return redirect(url_for('login'))
else:
return 'No such user!'
# session['user'] = request.form['user']
# title = request.args.get('title', request.form['user'])
# return render_template('login.html', title=title)
if 'user' in session:
return 'Hello %s!' % session['user']
# 当请求方式是 GET
else:
title = request.args.get('title', 'comsters')
response = make_response(render_template('login.html', title=title),200)
response.headers['key'] = 'lelelle'
return response
@app.route('/logout')
def logout():
session.pop('user', None)
return redirect(url_for('login'))
app.secret_key = '123sdf'
if __name__ == '__main__':
app.run(debug=True, port=8777)
浏览器按 F12 可查看 key 的值。
Cookie
from flask import Flask, make_response, render_template,request, session, url_for, redirect
import time
app = Flask(__name__)
@app.route('/login', methods=['POST', 'GET'])
def login():
# 当请求方式是 POST
if request.method == 'POST':
#print(request.form.get("user"))
if request.form['user'] == 'admin':
session['user'] = request.form['user']
response = make_response('Admin login successfully!')
response.set_cookie('login_time', time.strftime('%Y-%m-%d %H:%M:%S'))
else:
return 'No such user!'
# 当请求方式是 GET
else:
if 'user' in session:
login_time = request.cookies.get('login_time')
response = make_response('Hello %s, you logged in on %s' % (session['user'], login_time))
else:
title = request.args.get('title', 'comsters')
response = make_response(render_template('login.html', title=title), 200)
response.headers['key'] = 'lelelle'
return response
return response
@app.route('/logout')
def logout():
session.pop('user', None)
return redirect(url_for('login'))
app.secret_key = '123sdf'
if __name__ == '__main__':
app.run(debug=True, port=8777)
使用 .set_cookie( key, value, time) 来存储 cookie 值,第三个参数是cookie存在的时间,单位是秒,默认是浏览页面关闭时销毁该 cookie。
使用 .cookies.get( key ) 使用cookie值。
使用 ajax 通信
js 端:
function clicks(){
sendData = {'user':'admin'};
$.ajax({
url:"updatebg",
type:"post",
data:sendData,
dataType: 'json',
processData:false,
contentType:false,
success:function(data){
$('#divbg').css("background",data.colors);
},
error:function(e){
alert("error");
}
})
}
sendData : 发送数据,JSON格式
url : 接口,地址为路由地址
type : type 必须和接口保持一致,常用的有 POST、GET
data : 返回的数据格式为 JSON
python后台端:
@app.route('/updatebg', methods=['POST'], strict_slashes=False)
def update():
return jsonify({"colors": "red"})
返回的数据格式为 JSON,使用 jsonify 对数据进行格式化,路由为接口地址。