Sanic

2022-06-02


像 Sanic 和其他的异步 Python 库并不是让程序执行速度变得更快,只是让它们的组织方式变得更为高效而已。

配置

按照惯例,配置中的键名都以大写形式。

设置

1
# 方式一
2
app.config.DB_NAME = 'appdb'
3
# 方式二
4
app.config['DB_USER'] = 'appuser'
5
#方式三
6
db_settings = {
7
'DB_HOST': 'localhost',
8
'DB_NAME': 'appdb',
9
'DB_USER': 'appuser'
10
}
11
app.config.update(db_settings)

获取

1
app.config.DB_NAME
2
app.config['DB_NAME']
3
app.config.get('DB_NAME')
4
5
# 获取所有 config
6
app.config.items()

request

获取请求数据

JSON

Terminal window
1
curl localhost:8000 -d '{"foo": "bar"}'
1
print(request.json)
2
# 返回{'foo': 'bar'}

Form

Terminal window
1
curl localhost:8000 -d 'foo=bar'
1
print(request.body) # 原始字节形式
2
# 返回 b'foo=bar'
3
4
print(request.form) # 获取表单
5
# 返回 {'foo': ['bar']}
6
7
print(request.form.get("foo")) # 获取指定表单值
8
# 返回 bar
9
10
print(request.form.getlist("foo")) #获取值列表
11
# 返回 ['bar']

请求(URL)参数

Terminal window
1
http://127.0.0.1:8080/?key1=val1&key2=val2&key1=val3
1
# request.args, 返回的并非字典
2
request.args # 返回{'key1': ['val1', 'val3'], 'key2': ['val2']}
3
4
# 以字典形式返回元素
5
# 直接转为字典
6
dict(request.args) # 返回: {'key1': ['val1', 'val3'], 'key2': ['val2']}
7
# 转为字典形式 {'key1': 'val1', 'key2': 'val2'}
8
{key: value[0] for key, value in request.args.items()}
9
10
print(request.args.get("key1"))
11
# 返回单个值 val1
12
13
print(request.args.getlist("key1"))
14
# 以列表形式返回指定键值 ['val1', 'val3']
15
16
print(request.query_args)
17
# 返回所有元素[('key1', 'val1'), ('key2', 'val2'), ('key1', 'val3')]
18
19
print(request.query_string)
20
# 返回原始值 key1=val1&key2=val2&key1=val3

请求信息

1
request.ip # 请求 IP - 127.0.0.1
2
request.url # 完成 URL http://127.0.0.1:8000/api/v2/autoptz
3
request.path # /api/v2/autoptz

Uploaded

Terminal window
1
curl -F 'my_file=@/path/to/TEST' http://localhost:8000
1
print(request.body)
2
# 原始字节 b'--------------------------cb566ad845ad02d3\r\nContent-Disposition: form-data; name="my_file"; filename="TEST"\r\nContent-Type: application/octet-stream\r\n\r\nhello\n\r\n--------------------------cb566ad845ad02d3--\r\n'
3
4
print(request.files) # 返回字典形式
5
# 返回 {'my_file': [File(type='application/octet-stream', body=b'hello\n', name='TEST')]}
6
7
print(request.files.getlist("my_file"))
8
# 返回[File(type='application/octet-stream', body=b'hello\n', name='TEST')]

参数

  • debug=True: 开启调试模式
  • auto_reload=True: 开启自动重载
  • reload_dir=[“/path/to/one”, “/path/to/two”]: 额外目录重载
1
app.run(host="0.0.0.0", port="8080",
2
workers=4, dev=True)
1
{
2
"args": {
3
"--host=0.0.0.0", // 主机
4
"--port=8080", // 端口
5
"--workers=4", // 子线程数量
6
"--fast", // 最大线程
7
"--dev", // 开启调试模式 + 自动重载(v22.3 以上)
8
}
9
}

问题

AssertionError: daemonic processes are not allowed to have children

使用 sanic v22.9.1 出现,换回 v22.3.2 后正常。

参考