赞
踩
目录
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()
当您实例化一个 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())
有时,自定义一个 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 支持的方法有:
- 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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。