sanic
Contents
一、Helloworld
sanic 安装
python3 -m venv venv
. venv/bin/activate
pip3 install sanic
helloworld
from sanic import Sanic
from sanic import text
app = Sanic("Myapp")
@app.route("/")
async def test(request):
return response.text('Hello World')
if __name__ == '__main__':
app.run(host="0.0.0.0", port=7777)
vscode debug
{
"version": "0.2.0",
"configurations": [
{
"name": "Python Debugger: Current File",
"type": "debugpy",
"request": "launch",
"python": "${workspaceFolder}/venv/bin/python3",
"program": "main.py",
// "args": [
// "-nu"
// "-ro"
// ],
// "console": "integratedTerminal",
"console": "internalConsole",
}
]
}
[root@Krab sanic]🐳 curl 127.0.0.1:7777
Hello World
- Sanic 构建一个Sanic服务的实例
- name=None 服务名。通常可以用__name__预置变量,如果name为None,则从之前栈中获得module name。
- route() 路由装饰器,注册一个路由
- uri URL路径
二、Dev
1、路由
用户可以通过路由来设置URL与handler之间的关联。一个基本的路由形式如下:
from sanic import response
@app.route("/")
async def test(request):
return response.text('Hello World')
sanic的handler方法必须用async
关键字定义为异步方法。
Request参数
from sanic.response import text
# �参数名: tag,可以是任意字符
@app.route('/tag/<tag>')
async def tag_handler(request, tag):
return text('Tag - {}'.format(tag))
# 参数名: integer_arg,int类型
@app.route('/number/<integer_arg:int>')
async def integer_handler(request, integer_arg):
return text('Integer - {}'.format(integer_arg))
@app.route('/number/<number_arg:number>')
async def number_handler(request, number_arg):
return text('Number - {}'.format(number_arg))
# 参数名: name,英文字母
@app.route('/person/<name:[A-z]+>')
async def person_handler(request, name):
return text('Person - {}'.format(name))
# 参数名: folder_id,英文字母+数字,0~4个字符长度
@app.route('/folder/<folder_id:[A-z0-9]{0,4}>')
async def folder_handler(request, folder_id):
return text('Folder - {}'.format(folder_id))
HTTP 请求类型
默认请求类型是GET,如果用其它方法,需要单独指定。
from sanic.response import text
# post方法
@app.route('/post', methods=['POST'])
async def post_handler(request):
return text('POST request - {}'.format(request.json))
# get方法
@app.route('/get')
async def get_handler(request):
return text('GET request - {}'.format(request.args))
@app.route('/get', methods=['GET'])
async def get_handler(request):
return text('GET request - {}'.format(request.args))
Request
当服务端收到HTTP请求时,路由方法会传过来Request
对象。Request
对象包含以下属性:
- json JSON正文。
from sanic.response import json
@app.route("/json")
def post_json(request):
return json({ "received": True, "message": request.json })
- args dict,例如请求参数为
?key1=value1&key2=value2
,返回{'key1': ['value1'], 'key2': ['value2']}
- raw_args dict,更少封装的dict,很多时候比args还实用。例如请求参数为
?key1=value1&key2=value2
,返回{'key1': 'value1', 'key2': 'value2'}
- headers dict,一个大小写无关(一般都是小写)的dict,包含request header。
其它常用属性还包括:ip, port, url, host, path, quary_string
Response
使用sanic.response
模块创建response。
- json
from sanic import response
@app.route('/json')
def handle_request(request):
return response.json({
'message': 'Hello world!',
# header
headers={'X-Served-By': 'sanic'},
# status
status=200})
- redirect
from sanic import response
@app.route('/redirect')
def handle_request(request):
return response.redirect('/json')