Flask
除了Flask外,还有一些比较常用的web框架,如:Django、Tornado、Twisted
安装
pip install flask
hello world
# http://127.0.0.1:5000
from flask import Flask
app = Flask(__name__)
@app.route('/', methods=['POST', 'GET'])
def home():
return 'hello world'
app.run()
路由
格式:<转换器:参数>,如:<int|float|string|path:参数名>
string和path的区别是:string不能包含"/",而path可以
# http://127.0.0.1:5000/world
from flask import Flask
app = Flask(__name__)
@app.route('/<string:name>', methods=['POST', 'GET'])
def home(name):
return 'hello ' + name
app.run()
自定义转换器
from werkzeug.routing import BaseConverter
from flask import Flask
class RegexConverter(BaseConverter):
def __init__(self, url_map, regex):
super(RegexConverter, self).__init__(url_map)
self.regex = regex
app = Flask(__name__)
app.url_map.converters['re'] = RegexConverter
@app.route('/<re("\d+"):value>')
def home(value):
return "hello {}".format(value)
app.run()
模板
flask默认使用jinjia2模板引擎,现在大部分场景都使用前后端分离,所以这里就简单介绍下
新建templates目录,所有的模板放在该目录下
右键 -> Mark Directory as -> Template Folder -> Project:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def home():
d = {
'hello': '你好',
'world': '世界'
}
return render_template('index.html', data=d)
app.run()
<!doctype html>
<html lang="zh">
<head>
<title>模板</title>
</head>
<body>
{{ data['hello'] }} {{ data.world }}
</body>
</html>
重定向
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route("/baidu")
def toBaiDu():
return redirect('https://www.baidu.com')
@app.route("/")
def home():
return redirect(url_for("index"))
@app.route('/home')
def index():
return 'index'
app.run()
abort
from flask import Flask, abort, request
app = Flask(__name__)
@app.route("/", methods=['GET', 'POST'])
def home():
if request.method == 'GET':
abort(404)
return None
else:
return 'ok'
@app.errorhandler(404)
def handle404(err):
return '404'
app.run()
其他
GET请求、表单请求、合并获取GET和表单请求、JSON请求、JSON响应
from flask import Flask, jsonify, request, json, make_response
app = Flask(__name__)
# 响应数据中文原样输出,默认为False
app.config['JSON_AS_ASCII'] = False
@app.route("/", methods=['GET', 'POST'])
def index():
# GET请求
param1 = request.args.get("param1")
allGet = dict(request.args)
print(param1, allGet)
# 表单请求
form1 = request.form.get("form1")
allForm = dict(request.form)
print(form1, allForm)
# 获取GET和表单的合并参数,如果重名,GET参数的优先级更高
getAndFormParam1 = request.values.get("param1")
allGetAndForm = dict(request.values)
print(getAndFormParam1, allGetAndForm)
# JSON raw请求
dictJson = json.loads(request.data)
print(dictJson)
# JSON响应
# 如果是字典的话,以下3种方式都可以
# return jsonify(data)
# return make_response(data)
# return data
data = {
'name': "张三"
}
return jsonify(data)
# 如果是一个JSON的字符串,需要指定下mimetype
jsonData = '{"name":"张三"}'
response = make_response(jsonData)
response.mimetype = "application/json"
return response
app.run()
数据库
RPC框架
post http://127.0.0.1:9508/order/lists {"order_sn":"20220520111111"}
# index.py
from flask import Flask, request, json
from importlib import import_module
routes = {
'order/lists': {
'package': 'app.Services.OrderService',
'class': 'OrderService',
'method': 'lists'
}
}
app = Flask(__name__)
@app.route("/<path:routeKey>", methods=['GET', 'POST'])
def index(routeKey):
try:
if routeKey not in routes:
raise BaseException("路由不存在")
# 导入包
package = import_module(routes[routeKey]['package'])
# 获取类对象
obj = getattr(package, routes[routeKey]['class'])
obj = obj()
# 获取方法对象
method = getattr(obj, routes[routeKey]['method'])
if request.data:
params = json.loads(request.data)
else:
params = {}
# 调用方法
return method(params)
except BaseException as e:
return json.jsonify({
"code": -1,
"message": str(e)
})
if __name__ == '__main__':
app.run('127.0.0.1', port=9508)
# OrderService.py
class OrderService:
def lists(self, params):
return params
线上部署
使用ASGI服务器(如:Hypercorn),使用 asgiref WsgiToAsgi 适配器
pip install hypercorn
pip install asgiref
# main.py
from asgiref.wsgi import WsgiToAsgi
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return 'index'
asgi_app = WsgiToAsgi(app)
hypercorn -b 127.0.0.1:9508 main:asgi_app