本清单对 Flask 的入门进行了简要的概述,以及其常用示例。需要有 HTML
和 Python
基础。
入门
相关链接
Hello World
hello.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from flask import Flask
app = Flask(__name__)
@app.route('/') def hello(): return 'Hello World!'
if __name__ == '__main__': app.run()
|
运行 hello.py
程序
1 2 3 4
| $ python hello.py * Serving Flask app 'hello' * Running on http://127.0.0.1:5000 * Press CTRL+C to quit
|
或
1 2 3 4 5
| $ flask --app hello run * Serving Flask app 'hello' * Running on http://127.0.0.1:5000 * Press CTRL+C to quit $ flask run --host=0.0.0.0
|
启用调试模式,使用 --debug
选项
1
| $ flask --app hello --debug run
|
HTML 转义
1 2 3 4 5
| from markupsafe import escape
@app.route("/<name>") def hello(name): return f"Hello, {escape(name)}!"
|
路由
1 2 3 4 5 6 7
| @app.route('/') def index(): return 'Index Page'
@app.route('/hello') def hello(): return 'Hello, World'
|
变量规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from markupsafe import escape
@app.route('/user/<username>') def show_user_profile(username): return f'User {escape(username)}'
@app.route('/post/<int:post_id>') def show_post(post_id): return f'Post {post_id}'
@app.route('/path/<path:subpath>') def show_subpath(subpath): return f'Subpath {escape(subpath)}'
|
转换器类型:
:– |
– |
string |
(默认)接受任何没有斜杠的文本 |
int |
接受正整数 |
float |
接受正浮点值 |
path |
像字符串但也接受斜线 |
uuid |
接受 UUID 字符串 |
唯一 URL / 重定向行为
1 2 3 4 5 6 7
| @app.route('/projects/') def projects(): return 'The project page'
@app.route('/about') def about(): return 'The about page'
|
项目端点的规范 URL
有一个尾部斜杠。它类似于文件系统中的文件夹。如果您访问没有尾部斜杠 (/projects
) 的 URL
,Flask
会将您重定向到带有尾部斜杠 (/projects/
) 的规范 URL
URL 建设
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| from flask import url_for
@app.route('/') def index(): return 'index'
@app.route('/login') def login(): return 'login'
@app.route('/user/<username>') def profile(username): return f'{username}\'s profile'
with app.test_request_context(): print(url_for('index')) print(url_for('login')) print(url_for('login', next='/')) print(url_for('profile', username='John Doe'))
|
HTTP 方法
默认路由仅响应 GET
请求。可以使用 route()
装饰器的方法参数来处理不同的 HTTP
方法
1 2 3 4 5 6 7 8
| from flask import request
@app.route('/login',methods=['GET','POST']) def login(): if request.method == 'POST': return do_the_login() else: return show_the_login_form()
|
您还可以将不同方法的视图分成不同的函数。 Flask
为每个常见的 HTTP
方法提供了一种快捷方式,用于使用 get()
、post()
等来装饰此类路由
1 2 3 4 5 6 7
| @app.get('/login') def login_get(): return show_the_login_form()
@app.post('/login') def login_post(): return do_the_login()
|
Blueprint
创建蓝图Bp1
1 2 3 4 5 6 7 8 9 10 11 12
| from flask import Blueprint, abort, jsonify
Bp1 = Blueprint('imgBlue', __name__, template_folder='templates', url_prefix='/img')
@Bp1.route('/getimg') def getImg(): try: return jsonify(name="img", size="100KB") except Exception as e: abort(e)
|
创建蓝图Bp2
1 2 3 4 5 6 7 8 9 10 11 12
| from flask import Blueprint, abort, jsonify
Bp2 = Blueprint('videoBlue', __name__, template_folder='templates', url_prefix='/video')
@Bp2.route('/getvideo') def getvideo(): try: return jsonify(name="video", size="100GB") except Exception as e: abort(e)
|
在flask app中引用蓝图Bp1和Bp2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| from flask import Flask, jsonify from lantu.img import Bp1 from lantu.video import Bp2
app = Flask(__name__)
app.register_blueprint(Bp1) app.register_blueprint(Bp2)
@app.route('/') def index(): return jsonify(name='phyger')
if __name__ == '__main__': app.run(host="127.0.0.1", debug=True)
|
简单测试
1 2 3 4 5 6 7 8
| curl http://127.0.0.1:5000/ >> {"name":"phyger"}
curl http://127.0.0.1:5000/img/getimg >> {"name": "img", "size": "100KB"}
curl http://127.0.0.1:5000/video/getvideo >> {"name": "video", "size": "100GB"}
|