本清单对 Flask 的入门进行了简要的概述,以及其常用示例。需要有 HTMLPython 基础。

入门

相关链接

Hello World

hello.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 导入 Flask 类
from flask import Flask

# 创建应用实例
app = Flask(__name__) # 'Flask' 参数是 应用程序模块 或 包 的名称
# __name__是适用于大多数情况的便捷快捷方式

# 路由 (装饰器)
@app.route('/') # route()装饰器告诉 Flask 什么路径触发下面的功能
def hello():
# 该函数返回我们想要在浏览器中显示的消息内容
return 'Hello World!'
# 默认类型 HTML, 因此字符串中的 HTML 将被浏览器渲染
# 启动服务
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):
# 显示给定id的帖子,id是一个整数
return f'Post {post_id}'

@app.route('/path/<path:subpath>')
def show_subpath(subpath):
# 在 /path/ 之后显示子路径
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) 的 URLFlask 会将您重定向到带有尾部斜杠 (/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,并定义url前缀为/img
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,并定义url前缀为/video
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
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"}

评论
avatar
竹山一叶
技术分享 个人心得
Follow Me
公告
欢迎光临小站,这里是我日常工作和学习中收集和整理的总结,希望能对你有所帮助:)

本站的内容经过个人加工总结而来,也参考了网友们分享的资料,如有侵权,请第一时间联系我,我将及时进行修改或删除😊
文章归档文章分类文章标签复制本文标题复制本文地址
随便逛逛