Contents

sanic

一、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')