目录
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)