您现在的位置是:网站首页>技术文章>Web个人网站

异步Web框架Sanic

Petrichor2020-03-18 17:30Web208人已围观

简介个人网站,用来做什么?我刚开始就把它当做一个我吐槽心情的地方,也就相当于一个网络记事本,也会放上一些照片。后来也用来记录自己所学习的知识。

      Sanic 是一个 Python 3.6+ web 服务器和web框架,它的编写速度很快。它允许使用python 3.5中添加的 async/await 语法,这使得您的代码不阻塞,速度更快。

      先来个简单的示例:

from sanic import Sanic
from sanic.response import text


app = Sanic()


@app.route('/')
def index(request):
    return text('hello word')


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

      运行服务器

python main.py

       打开地址 http://0.0.0.0:8000 在您的网络浏览器中。你应该看到信息’hello word‘。

      是不是发现和Flask惊人的相似!!!

路由(Routing)

      路由用于把一个函数绑定到一个 URL。下面是一些基本的例子:

@app.route('/')
def index():
    return text('Index Page')

@app.route('/hello')
def hello():
    return text('Hello World')

      当然,你还可以动态的变化URL的某些部分,还可以为一个函数指定多个规则。

变量规则

      通过把 URL 的一部分标记为 <variable_name> 就可以在 URL 中添加变量。标记的 部分会作为关键字参数传递给函数,通过使用 <converter:variable_name>,可以 选择性的加上一个转换器,为变量指定特定的类型,如果传入的类型错误,Sanic会抛出NotFound异常。请看下面的例子:

from sanic.response import text

@app.route('/tag/<tag>')
async def tag_handler(request, tag):
    return text('Tag - {}'.format(tag))

@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))

@app.route('/person/<name:[A-z]>')
async def person_handler(request, name):
    return text('Person - {}'.format(name))

@app.route('/folder/<folder_id:[A-z0-9]{0,4}>')
async def folder_handler(request, folder_id):
    return text('Folder - {}'.format(folder_id))

HTTP 请求类型

      默认情况下,我们定义的URL只支持GET 请求,@app.route装饰器提供了一个可选参数methods,这个参数允许传入所有HTTP方法。

from sanic.response import text

@app.route('/post', methods=['POST'])
async def post_handler(request):
    return text('POST request - {}'.format(request.json))

@app.route('/get', methods=['GET'])
async def get_handler(request):
    return text('GET request - {}'.format(request.args))

      也可以简写为:

from sanic.response import text

@app.post('/post')
async def post_handler(request):
    return text('POST request - {}'.format(request.json))

@app.get('/get')
async def get_handler(request):
    return text('GET request - {}'.format(request.args))

add_route 方法

      除了@app.route装饰器,Sanic 还提供了add_route方法。

from sanic.response import text

# Define the handler functions
async def handler1(request):
    return text('OK')

async def handler2(request, name):
    return text('Folder - {}'.format(name))

async def person_handler2(request, name):
    return text('Person - {}'.format(name))

# Add each handler function as a route
app.add_route(handler1, '/test')
app.add_route(handler2, '/folder/<name>')
app.add_route(person_handler2, '/person/<name:[A-z]>', methods=['GET'])

      @app.route 只是包装了 add_route方法。

URL 构建

      如果可以匹配URL,那么Sanic可以生成URL吗?当然可以,url_for() 函数就是用于构建指定函数的URL的。它把函数名称作为第一个参数,其余参数对应URL中的变量,例如:

@app.route('/')
async def index(request):
    # generate a URL for the endpoint `post_handler`
    url = app.url_for('post_handler', post_id=5)
    # the URL is `/posts/5`, redirect to it
    return redirect(url)


@app.route('/posts/<post_id>')
async def post_handler(request, post_id):
    return text('Post - {}'.format(post_id))

      未定义变量会作为URL的查询参数:

url = app.url_for('post_handler', post_id=5, arg_one='one', arg_two='two')
# /posts/5?arg_one=one&arg_two=two

# 支持多值参数
url = app.url_for('post_handler', post_id=5, arg_one=['one', 'two'])
# /posts/5?arg_one=one&arg_one=two

 

很赞哦!(4)

文章评论