当前位置:   article > 正文

sanic框架学习day1_sanic框架 ctx

sanic框架 ctx

目录

安装(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

 快速起一个应用

  1. from sanic import Sanic
  2. from sanic.response import text
  3. app = Sanic("test")
  4. @app.get('/')
  5. async def test(request):
  6. return text("hello yuanbao ")
  7. if __name__ == '__main__':
  8. app.run()
  9. #注意点
  10. 1.需要实例化Sanic()
  11. 2.函数前面一般需要async字段声明
  12. 3.函数的第一个参数需要是request
  13. 4.实例化的时候,最好sanic()里面加上模块名字不然运行会报错
  14. 5.必须Response 或继承自 Response 的类作为响应类型
  15. 6.运行的话直接使用sanic server.app,我这里是直接py文件命名为server

应用上下文

数据库的连接为例

21.3 版之前的 Sanic 版本中

  1. from sanic import Sanic
  2. app = Sanic("server")
  3. app.db = Database()

21.3的版本以及之后版本

  1. from sanic import Sanic
  2. app = Sanic()
  3. app.ctx.db = Database()

APP注册表

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

  1. # ./path/to/server.py
  2. from sanic import Sanic
  3. app = Sanic("my_awesome_server")
  4. # ./path/to/somewhere_else.py
  5. from sanic import Sanic
  6. app = Sanic.get_app("my_awesome_server")

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

  1. app = Sanic.get_app(
  2. "non-existing",
  3. force_create=True,
  4. )

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

  1. Sanic("My only app")
  2. app = Sanic.get_app()

配置

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

  1. from sanic import Sanic
  2. app = Sanic("test")
  3. app.config.DB_NAME = "appdb"
  4. app.config['DB_USER'] = "appuser"
  5. db_settings = {
  6. 'DB_HOST': 'localhost',
  7. 'DB_NAME': 'appdb',
  8. 'DB_USER': 'appuser'
  9. }
  10. app.config.update(db_settings)

自定义配置

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

  1. from sanic.config import Config
  2. from sanic import Sanic
  3. class MyConfig(Config):
  4. FOO = "bar"
  5. app = Sanic(..., config=MyConfig())

自定义上下文

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

  1. app = Sanic(..., ctx=1)
  2. app = Sanic(..., ctx={})
  3. class MyContext:
  4. ...
  5. app = Sanic(..., ctx=MyContext())

自定义请求(Custom requests)

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

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

  1. import time
  2. from sanic import Request, Sanic, text
  3. class NanoSecondRequest(Request):
  4. @classmethot
  5. def generate_id(*_):
  6. return time.time_ns()
  7. app = Sanic(....,request_class = NanoSecondRequest)
  8. @app.get("/")
  9. async def handler(request):
  10. return text(str(request.id))
  11. *_就类似于*args,不能直接打印*_,这个没有实际意义

自定义错误响应函数

  1. from sanic.handerls import ErrorHandler
  2. class CustomErroHandler(ErrorHandler):
  3. def default(self,request,exception):
  4. return super().default(request, exception)
  5. 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
    1. from sanic.views import HTTPMethodView
    2. from sanic.response import text
    3. class SimpleView(HTTPMethodView):
    4. def get(self, request):
    5. return text("hah")
    6. async def post(self, request):
    7. return text("hahhaha")
    8. def put(self, request):
    9. return text("yuanbao")
    10. def patch(self, request):
    11. return text("hh")
    12. def delete(self, request):
    13. return text("dd")
    14. app.add_route(SimpleView, as_view(), "/")

    路由

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

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

    1. app.add_route(
    2. handler,
    3. '/test',
    4. methods=["POST", "PUT"],
    5. )

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

    1. app.add_route(
    2. handler,
    3. '/test',
    4. methods=["POST", "PUT"],
    5. )

路由参数

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

  1. from sanic import Sanic
  2. app = Sanic()
  3. @app.get("/tag/<tag>")
  4. async def tag_handler(request, tag):
  5. return text("Tag {}".format(tag))
  6. @app.get("/foo/<foo_id:uuid>")
  7. async def uuid_handler(request, foo_id: UUID):
  8. return text("UUID {}".format(foo_id)

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号