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 后正常。

参考