1,示例

这部的文档是简单的示例集合,它能够帮助你快速的启动应用大部分的应用,这些应用大多事分类的,并且提供给ini工作的连接代码:

1.1,基础示例

这部分示例集成了提供简单sanic简单的代码

单一APP

一个简单的sanic应用with一个简单的异步方法通过text和json类型的响应.

from sanic import Sanic
from sanic import response as res
# 实例化Sanic对象
app = Sanic(__name__) # 服务器访问的路由
@app.route("/")
async def test(req):
return res.text("I am a teapot", status=418) # 返回的是字符串格式的数据 # 开启服务
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8000, debug=True)
from sanic import Sanic
from sanic import response # 实例化Sanic对象
app = Sanic(__name__) # 服务器的访问路由
@app.route("/")
async def test(request):
return response.json({"test": True}) # 返回的是json数据格式 # 启动服务
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8000)

1.2,使用sanic.view来创建app应用

展示了使用sanic.viewes.httpmethodview的简单机制,以及将其扩展为为为视图提供自定义异步行为的方法

from sanic import Sanic
from sanic.views import HTTPMethodView
from sanic.response import text # 实例化Sanic对象
app = Sanic("some_name") class SimpleView(HTTPMethodView): def get(self, request):
return text("I am get method") def post(self, request):
return text("I am post method") def put(self, request):
return text("I am put method") def patch(self, requets):
return text("I am patch method") def delete(self, request):
return text("I am delete method") class SimpleAsyncView(HTTPMethodView):
async def get(self, request):
return text("I am async get method") async def post(self, request):
return text("I am async post method") async def put(self, request):
return text("I am async put method") app.add_route(SimpleView.as_view(), "/") # 注册视图类(后边加访问的路由)
app.add_route(SimpleAsyncView.as_view(), "/async") # 注册视图类(后边加访问的路由) if __name__ == '__main__':
app.run(host="0.0.0.0", port=8000, debug=True)

1.3,URL跳转

from sanic import Sanic
from sanic import response app = Sanic(__name__) # 同步函数的跳转
@app.route("/")
def handle_response(request):
return response.redirect("/redirect") # 异步处理函数到的跳转
@app.route("/redirect")
async def test(request):
return response.json({"Redirected": True}) if __name__ == '__main__':
app.run(host="0.0.0.0", port=8000)

1.4,redirection URL

Sanic提供了一种跳转页面的简单方法叫作url_for,它将会独一无二的url名字作为参数并且返回给你分配实际的路由地址.,有了url_for这个方法将帮助我们简化在不同应用跳转中请求的影响,

from sanic import Sanic
from sanic import response app = Sanic(__name__) @app.route("/")
async def index(request):
# 用post_handler生成url端
url = app.url_for("post_handler", post_id=5)
# 提升成的url最后跳转的页面变成了"/post/5"
return response.redirect(url) @app.route("/posts/<post_id>")
async def post_handler(request, post_id):
return response.text("Post- {}".format(post_id)) if __name__ == '__main__':
app.run(host="0.0.0.0", port=8000, debug=True)

1.5,蓝图

Sanic提供了一个惊人的特性,可以将您的API和路由分组到一个逻辑集合中,这个集合可以很容易地导入并插入到您的任何Sanic应用程序中,它被称为蓝图。

from sanic import Blueprint, Sanic
from sanic.response import file,json
# 实例化Sanic对象
app = Sanic(__name__)
blueprint = Blueprint("name", url_prefix="/my_blueprint")
blueprint2 = Blueprint("name2", url_prefix="/my_blueprint2")
blueprint3 = Blueprint("name3", url_prefix="/my_blueprint3") # blueprint蓝图的路由
@blueprint.route("/foo")
async def foo(request):
return json({"msg": "hi from blueprint"}) # blueprint2蓝图的路由
@blueprint2.route("/foo")
async def foo2(request):
return json({"msg": "hi from blueprint2"}) # blueprint3蓝图的路由
@blueprint3.route("/foo")
async def index(request):
return await file("websocket.html") # websocket的路由
@app.websocket("/foo")
async def foo3(request, ws):
while True:
data = "hello!"
print("Sending:" + data)
await ws.send(data)
data = await ws.recv()
print("Received:" + data)
# 注册蓝图
app.blueprint(blueprint)
app.blueprint(blueprint2)
app.blueprint(blueprint3) app.run(host="0.0.0.0", port=8000)

1.6,日志功能增强

from sanic import Sanic
from sanic import response
import logging logging_format = "[%(asctime)s] % (process)d-%(Levelname)s"
logging_format += "%(module)s::%(funcName)s():1%(Lineno)d:"
logging_format += "%(message)s" logging.basicConfig(
format=logging_format,
level=logging.DEBUG
)
log = logging.getLogger() # 设置日志去重写默认的配置
sanic = Sanic() @sanic.route("/")
def test(request):
log.info("received request; responding with 'hey'")
return response.text("hey") sanic.run(host="0.0.0.0", port=8000)

下面的示例代码演示了sanic.app.sanic.middleware()的用法,以便提供一种机制为每个传入请求分配一个唯一的请求ID,并通过aiotask上下文记录它们

"""
基于https://github.com/skyscanner/aiotask-context中的示例
和“examples/override logging,run.py”。
需要https://github.com/skyscanner/aiotask-context/tree/52efbc21e2def2d52abb9a8e951f3ce5e6f690或更高版本
$pip安装git+https://github.com/skyscanner/aiotask-context.git
"""
import asyncio
import uuid
import logging
from signal import signal, SIGINT
from sanic import Sanic
from sanic import response
import uvloop # windows下不支持uvloop
import aiotask_content as context log = logging.getLogger(__name__) class RequestIdFilter(logging.Filter):
def filter(self, record):
record.request_id = context.get("X-Request-ID")
return True LOG_SETTINGS = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'DEBUG',
'formatter': 'default',
'filters': ['requestid'],
},
},
'filters': {
'requestid': {
'()': RequestIdFilter,
},
},
'formatters': {
'default': {
'format': '%(asctime)s %(levelname)s %(name)s:%(lineno)d %(request_id)s | %(message)s',
},
},
'loggers': {
'': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': True
},
}
}
app = Sanic(__name__, log_config=LOG_SETTINGS)
@app.route("/")
async def test(request):
log.debug("X-Request-ID: %s", context.get("X-Request-ID"))
log.info("Hello from test!")
return response.json({"test": True}) if __name__ == '__main__':
asyncio.set_event_loop(uvloop.new_event_loop())
server = app.create_server(host="0.0.0.0", port=8000)
loop = asyncio.get_event_loop()
loop.set_task_factory(context.task_factory)
task = asyncio.ensure_future(server)
try:
loop.run_forever()
except:
loop.stop()

1.7,sanic流支持

Sanic框架内置了对大文件流的支持,下面的代码解释了使用流支持设置SANIC应用程序的过程。

from sanic import Sanic
from sanic.views import CompositionView
from sanic.views import HTTPMethodView
from sanic.views import stream as stream_decorator
from sanic.blueprints import Blueprint
from sanic.response import stream, text bp = Blueprint("blueprint_request_stream")
app = Sanic("request_stream") class SimpleView(HTTPMethodView): @stream_decorator
async def post(self, request):
result = ""
while 1:
body = await request.stream.get()
if not body:
break
result += body.decode("utf-8")
return text(result) @app.post("/stream", stream=True)
async def handler(request):
async def streaming(response):
while 1:
body = await request.stream.get()
if not body:
break
body = body.decode("utf-8").replace("1", "A")
await response.write(body)
return stream(streaming) @bp.put("/bp_stream", stream=True)
async def bp_handler(request):
result = ""
while 1:
body = await request.stream.get()
if not body:
break
result += body.decode("utf-8").replace("1", "A")
return text(result) async def post_handler(request):
result = ""
while 1:
body = await request.stream.get()
if not body:
break
result += body.decode("utf-8")
return text(result) app.blueprint(bp)
app.add_route(SimpleView.as_view(), "/method_view")
view = CompositionView()
view.add(["POST"], post_handler, stream=True)
app.add_route(view, "/composition_view") if __name__ == '__main__':
app.run(host="0.0.0.0", port=8000)

简单的客户端展示使用客户端代码流应用(测试一下代码)

import requests
# 警告:这是一个繁重的进程
data = ""
for i in range(1, 250000):
data += str(i) r = requests.post("http://0.0.0.0:8000/stream", data=data) print(r.text)

1.8,sanic的并发支持

SANIC支持通过多个工作人员支持启动应用程序。但是,为了确保高效的执行,能够限制每个进程/循环的并发性是很重要的。下面的代码部分提供了一个简单的示例,说明如何在asyncio.semaphore的帮助下限制并发性

from sanic import Sanic
from sanic.response import json import asyncio
import aiohttp
app = Sanic(__name__) sem = None @app.listener("before_server_start")
def init(sanic, loop):
global sem
concurrency_per_work = 4
sem = asyncio.Semaphore(concurrency_per_work,loop=loop) async def bounded_fetch(session, url):
# 使用session对象执行url的get请求
async with sem, session.get(url) as response:
return await response.json() @app.route("/")
async def test(request):
# 下载并且提供json例子的服务
url = "http://api.github.com/repos/channelcat/sanic" async with aiohttp.ClientSession() as session:
response = await bounded_fetch(session, url)
return json(response) app.run(host="0.0.0.0", port=8000, workers=2)

sanic官方文档解析之Example(一)的更多相关文章

  1. sanic官方文档解析之Deploying(部署)和Extension(扩展)

    1,Deploying(部署) 通过内置的websocket可以很简单的部署sanic项目,之后通过实例sanic.Sanic,我们可以运行run这个方法通过接下来的关键字参数 host (defau ...

  2. sanic官方文档解析之Custom Protocols(自定义协议)和Socket(网络套接字)

    1,Custom Protocol:自定义协议 温馨提示:自定义协议是一个高级用法,大多数的读者不需要用到此功能 通过特殊的自定义协议,你可以改变sanic的协议,自定义协议需要继承子类asyncio ...

  3. sanic官方文档解析之路由

    1,路由,路由相当于一个网址的地址,来确定网址的位置和唯一性 当http://server.url/被允许访问服务器,当最后的"/"通过路由匹配到了业务逻辑处理的函数,将会返回一个 ...

  4. sanic官方文档解析之logging和request Data

    1,sanic的logging: Sanic允许有做不同类型的日志(通过的日志,错误的日志),在基于Python3的日志API接口请求,你必须具备基本的Python3的日志知识,在你如果想创建一个新的 ...

  5. sanic官方文档解析之下载和Configuration

    1,sanic框架是做什么的? sanic的官方网址:https://sanic.readthedocs.io/en/latest/ sanic框架是一个类似于flask框架的在Python3.5以上 ...

  6. sanic官方文档解析之Example(二)

    1,通过docker部署sanic项目 通过Docker和Docker Compose部署SANIC应用程序是一项很容易实现的任务,下面的示例提供了示例simple_server.py的部署 FROM ...

  7. sanic官方文档解析之ssl,debug mode模式和test(测试)

    1,ssl 示例: 可选择的SSLContent from sanic import Sanic import ssl context = ssl.create_default_context(pur ...

  8. sanic官方文档解析之streaming(流动,滚动)和class_based_views(CBV的写法)

    1,streaming(流媒体) 1.1请求流媒体 Sanic允许你通过流媒体携带请求数据,如下,当请求结束await request.stream.read()就会返回None,仅仅只有post请求 ...

  9. sanic官方文档解析之websocket(网络套接字)和handle decorators(处理程序装饰器)

    1,websocket(网络套接字) 在websocket上Sanic提供了一种简单使用的抽象化,来设置websocket(网络套接字) from sanic import Sanic from sa ...

随机推荐

  1. TOJ 1203: Number Sequence

    1203: Number Sequence Time Limit(Common/Java):1000MS/10000MS     Memory Limit:65536KByte Total Submi ...

  2. 【JavaScript 1—基础知识点】:宏观概述

    导读:JavaScript是一门新的(也可以说是旧的或者半新语言),里面有很多的知识点都能和已有的知识产生共鸣.但是,虽然简单,相同点也有很多,也有不同点.我脑袋也不好使,所以对于我来说,还是有必要再 ...

  3. E. Lost in WHU。矩阵快速幂!

    E. Lost in WHU 比赛的时候一直不知道样例怎么来的,然后和队友推了一下,然后还是没什么思路,样例手推很困难,然后我随口枚举了几个算法dp.广搜.快速幂.比赛结束问了谷队长结果真的是用快速幂 ...

  4. iOS学习笔记19-地图(一)定位CoreLocation

    一.定位介绍 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.要实现 ...

  5. HackerRank# Hexagonal Grid

    原题地址 铺瓷砖的变种,做法也是类似 假设地板长下面这样,灰色的是无法填充的空洞,初始时可以把N块之外的地板填充成灰色的,便于边界处理 假设现在从后向前已经处理完了一部分,绿色的砖块代表已经遍历过了, ...

  6. BZOJ 3230 相似子串 ——后缀数组

    题目的Source好有趣. 我们求出SA,然后求出每一个后缀中与前面本质不同的字符串的个数. 然后二分求出当前的字符串. 然后就是正反两次后缀数组求LCP的裸题了. 要注意,这时两个串的起点可能会相同 ...

  7. 刷题总结——mayan游戏(NOIP2011提高组day2T3)

    题目: 题目背景 NOIP2011提高组 DAY1 试题. 题目描述 Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个 7 行 5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即 ...

  8. 【树状数组区间修改单点查询+分组】HDU 4267 A Simple Problem with Integers

    http://acm.hdu.edu.cn/showproblem.php?pid=4267 [思路] 树状数组的区间修改:在区间[a, b]内更新+x就在a的位置+x. 然后在b+1的位置-x 树状 ...

  9. *LOJ#6227. 「网络流 24 题」最长k可重线段集问题

    $n \leq 500$条平面上的线段,问一种挑选方法,使得不存在直线$x=p$与挑选的直线有超过$k$个交点,且选得的直线总长度最长. 横坐标每个点开一个点,一条线段就把对应横坐标连一条容量一费用( ...

  10. 转载免费的SSL证书

    目前我知道的有2种方式进行免费的SSL证书的获取 第一种:腾讯云申请 第二种:Let's Encrypt (国外在) 我一直使用第一种,还可以,有效期1年. 以下转载第二种: 实战申请Let's En ...