当前位置: 首页 > 工具软件 > Sanic > 使用案例 >

sanic框架学习day1

汪驰
2023-12-01

目录

安装(centos7,暂时只支持Linux跟Mac )

 快速起一个应用

应用上下文

APP注册表

配置

自定义配置

自定义上下文

自定义请求(Custom requests)

自定义错误响应函数

定义视图

路由

路由参数


安装(centos7,暂时只支持Linux跟Mac )

1.pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.直接使用pip install sanic报错 ,于是给设置了超时时间以及给加了一个源

pip --default-timeout=1688 install sanic -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 
 

2.安装sanic扩展源

 pip install sanic-ext -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

 快速起一个应用


from sanic import Sanic
from sanic.response import text

app = Sanic("test")

@app.get('/')
async def test(request):
    return text("hello  yuanbao ")

if __name__ == '__main__':
    app.run()

#注意点
1.需要实例化Sanic()
2.函数前面一般需要async字段声明
3.函数的第一个参数需要是request
4.实例化的时候,最好sanic()里面加上模块名字不然运行会报错
5.必须Response 或继承自 Response 的类作为响应类型
6.运行的话直接使用sanic server.app,我这里是直接py文件命名为server

应用上下文

数据库的连接为例

21.3 版之前的 Sanic 版本中

from sanic import Sanic

app = Sanic("server")

app.db = Database()

21.3的版本以及之后版本

from sanic import Sanic

app = Sanic()

app.ctx.db = Database()

APP注册表

当您实例化一个 Sanic 对象之后, 您就可以随时通过 Sanic 注册表来获取该对象了,尤其是当您在无法通过其他方式来获取 Sanic 对象的时候, 这种方式将对您有非常大的帮助。
 

# ./path/to/server.py
from sanic import Sanic

app = Sanic("my_awesome_server")

# ./path/to/somewhere_else.py
from sanic import Sanic

app = Sanic.get_app("my_awesome_server")

如果您希望使用 Sanic.get_app("non-existing") 来获取不存在的 Sanic 对象, 您应该通过添加 force_create 参数,此参数意味着如果要获取的 Sanic 对象不存在,则主动创建一个同名的 Sanic 对象并返回。如果不设置该参数,那么默认情况下将会抛出 SanicException 异常。

app = Sanic.get_app(
    "non-existing",
    force_create=True,
)

如果 只有一个 Sanic 实例被注册了,那么调用 Sanic.get_app() 时如果不传入任何参数则将返回该实例。

Sanic("My only app")

app = Sanic.get_app()

配置

sanic 配置是保存在sanic对象的config属性中,可以使用属性操作或者字典操作的方式来修改,建议使用大写作为配置的键名。

from sanic import Sanic

app = Sanic("test")

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)

自定义配置

只需要继承config类,然后将配置的对象直接传递到 Sanic 实例中

from sanic.config import Config
from sanic import Sanic

class MyConfig(Config):
    FOO = "bar"


app = Sanic(..., config=MyConfig())

自定义上下文

在默认情况下,应用程序上下文是一个 SimpleNamespace(opens new window) 实例,它允许您在上面设置任何您想要的属性。然而,您也可以选择使用其他对象来代替。

app = Sanic(..., ctx=1)

app = Sanic(..., ctx={})

class MyContext:
    ...


app = Sanic(..., ctx=MyContext())

自定义请求(Custom requests)

有时,自定义一个 Request 类显得很重要。举一个简单的例子,设置自定义的 request.id 属性。

重要记住,您应该传入  对象作为参数,而不是该类的实例。

import time

from sanic import Request, Sanic, text


class NanoSecondRequest(Request):
    @classmethot
    def generate_id(*_):
        return time.time_ns()

app = Sanic(....,request_class = NanoSecondRequest)

@app.get("/")
async def handler(request):
    return text(str(request.id))


*_就类似于*args,不能直接打印*_,这个没有实际意义

自定义错误响应函数

from sanic.handerls import ErrorHandler


class CustomErroHandler(ErrorHandler):
    def default(self,request,exception):
        return super().default(request, exception)


app = Sanic(...,error_handler=CustomErrorHandler())

定义视图

基于类的视图应该是 HTTPMethodView 的子类 。您可以使用相应的 HTTP 方法的名称实现类方法。如果收到的请求没有定义的方法,将生成 405: Method not allowed 响应。

若想要将基于类的视图挂载到路由上,则应该使用 app.add_route 方法,其中第一个参数是使用 as_view 调用后的已经定义好的类,第二个参数是要分配的 URL 路由。这里个人觉得跟django框架有点类似

HTTPMethodView 支持的方法有:

  • get
  • post
  • put
  • patch
  • delete
  • head
  • options
    from sanic.views import HTTPMethodView
    from sanic.response import text
    
    class SimpleView(HTTPMethodView):
        
        def get(self, request):
            return text("hah")
        
        async def post(self, request):
            return text("hahhaha")
    
        def put(self, request):
            return text("yuanbao")
    
        def patch(self, request):
            return text("hh")
    
        def delete(self, request):
            return text("dd")
    
    app.add_route(SimpleView, as_view(), "/")

    路由

  • 将响应函数进行挂载的最基本方式就是使用 app.add_route()

  • async def handler(request):
        return text("OK")
    
    
    app.add_route(handler, "/test")
  • 默认的情况下,路由会绑定监听 HTTP GET 请求方式, 您可以通过修改 methods 参数,从而达到使用一个响应函数响应 HTTP 的多种请求方式。注意

  • app.add_route(
        handler,
        '/test',
        methods=["POST", "PUT"],
    )

    您也可以使用装饰器来进行路由绑定,下面是使用装饰器的方式进行路由绑定的例子,实现的效果和上一个例子相同。

  • app.add_route(
        handler,
        '/test',
        methods=["POST", "PUT"],
    )

路由参数

Sanic允许模式匹配,并从URL中提取值,然后将这些参数作为关键字参数传递到响应函数中

from sanic import Sanic

app = Sanic()


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

@app.get("/foo/<foo_id:uuid>")
async def uuid_handler(request, foo_id: UUID):
    return text("UUID {}".format(foo_id)

 类似资料: