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: -> Python Interpreter -> Jinjia2

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

results matching ""

    No results matching ""