install:: python -m pip install asnic
use:: from sanic import Sanic
github::
docs:: https://sanic.dev/zh/guide/
像 Sanic 和其他的异步 Python 库并不是让程序执行速度变得更快,只是让它们的组织方式变得更为高效而已。
配置
按照惯例,配置中的键名都以大写形式。
设置
# 方式一
app.config.DB_NAME = 'appdb'
# 方式二
app.config['DB_USER'] = 'appuser'
#方式三
db_settings = {
'DB_HOST': 'localhost',
'DB_NAME': 'appdb',
'DB_USER': 'appuser'
}
app.config.update(db_settings)
获取
app.config.DB_NAME
app.config['DB_NAME']
app.config.get('DB_NAME')
# 获取所有 config
app.config.items()
request
获取请求数据
JSON
curl localhost:8000 -d '{"foo": "bar"}'
print(request.json)
# 返回{'foo': 'bar'}
Form
curl localhost:8000 -d 'foo=bar'
print(request.body) # 原始字节形式
# 返回 b'foo=bar'
print(request.form) # 获取表单
# 返回 {'foo': ['bar']}
print(request.form.get("foo")) # 获取指定表单值
# 返回 bar
print(request.form.getlist("foo")) #获取值列表
# 返回 ['bar']
请求(URL)参数
http://127.0.0.1:8080/?key1=val1&key2=val2&key1=val3
# request.args, 返回的并非字典
request.args # 返回{'key1': ['val1', 'val3'], 'key2': ['val2']}
# 以字典形式返回元素
# 直接转为字典
dict(request.args) # 返回: {'key1': ['val1', 'val3'], 'key2': ['val2']}
# 转为字典形式 {'key1': 'val1', 'key2': 'val2'}
{key: value[0] for key, value in request.args.items()}
print(request.args.get("key1"))
# 返回单个值 val1
print(request.args.getlist("key1"))
# 以列表形式返回指定键值 ['val1', 'val3']
print(request.query_args)
# 返回所有元素[('key1', 'val1'), ('key2', 'val2'), ('key1', 'val3')]
print(request.query_string)
# 返回原始值 key1=val1&key2=val2&key1=val3
请求信息
request.ip # 请求 IP - 127.0.0.1
request.url # 完成 URL http://127.0.0.1:8000/api/v2/autoptz
request.path # /api/v2/autoptz
Uploaded
curl -F 'my_file=@/path/to/TEST' http://localhost:8000
print(request.body)
# 原始字节 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'
print(request.files) # 返回字典形式
# 返回 {'my_file': [File(type='application/octet-stream', body=b'hello\n', name='TEST')]}
print(request.files.getlist("my_file"))
# 返回[File(type='application/octet-stream', body=b'hello\n', name='TEST')]
参数
- debug=True: 开启调试模式
- auto_reload=True: 开启自动重载
- reload_dir=[“/path/to/one”, “/path/to/two”]: 额外目录重载
app.run(host="0.0.0.0", port="8080",
workers=4, dev=True)
{
"args": {
"--host=0.0.0.0", // 主机
"--port=8080", // 端口
"--workers=4", // 子线程数量
"--fast", // 最大线程
"--dev", // 开启调试模式 + 自动重载(v22.3 以上)
}
}
问题
AssertionError: daemonic processes are not allowed to have children
使用 sanic v22.9.1 出现,换回 v22.3.2 后正常。