结合前面讲的配置、项目结构、页面渲染、数据库连接,构造一个优雅的Sanic应用对你来说估计没什么大问题了,但是在实际使用过程中,可能你会碰到各种各样的需求,与之对应,你也会遇到千奇百怪的问题,除了在官方pro提issue,你大部分问题都需要自己去面对,看官方的介绍大概就可以明白Sanic框架的重心不会放在诸如session cache reload authorized这些问题上 本文最新内容可到github上阅读 6.常用的技巧 Async Python 3.5+ web server that’s written to go fast 此篇我将将我遇到的一些问题以及解决方案一一记录下来,估计会持续更新,因为问题是不断的哈哈,可能有些问题与前面讲的有些重复,你大可略过,我将其总结成一些小技巧,供大家参考,具体如下: api请求json参数以及api接口验证 gRPC的异步调用方式 Blueprint html&templates编写 cache 热加载 session 对于一些问题,我将编写一个小服务来演示这些技巧,具体见demo06,依旧使用前面rss的那个例子,经过修改一番后的rss例子现在目录变成这样子了,里面加了我遇到的各种问题的解决方案,或许你只需要关注你想要了解的就好,如果你有其他的问题,欢迎issue提问,目录大概如下所示: src ├── config │ ├── __init__.py │ ├── config.py │ ├── dev_config.py │ └── pro_config.py ├── database │ ├── __init__.py │ └── redis_base ├── grpc_service │ ├── __init__.py │ ├── grpc_asyncio_client.py │ ├── grpc_client.py │ ├── grpc_server.py │ ├── hello_grpc.py │ ├── hello_pb2.

介绍中说的很明白,Sanic 是一个可以使用 async/await 语法编写项目的异步非阻塞框架,既然是异步框架,那么在使用过程中用到的第三方包也最好是异步的,比如http请求,最好就使用aihttp而非requests,对于数据库的连接,也是同样如此,下面我将用代码的形式来说明下如何在Sanic中连接数据库。 操作Mysql 对于mysql数据库的异步操作,我只在一些脚本中用过,用的是aiomysql,其中官方文档中讲得很清楚,也支持结合sqlalchemy编写ORM,然后aiomysql提供了自己编写的异步引擎。 from aiomysql.sa import create_engine # 这个才是关键 下面我编写一个具体的例子来用异步语句操作下数据库,首先建立如下目录: aio_mysql ├── demo.py ├── model.py └── requirements.txt 建立表: create database test_mysql; CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, user_name VARCHAR(16) NOT NULL, pwd VARCHAR(32) NOT NULL, real_name VARCHAR(6) NOT NULL ); 一切准备就绪,下面编写代码: # script: model.py import sqlalchemy as sa metadata = sa.MetaData() user = sa.Table( 'user', metadata, sa.Column('id', sa.Integer, autoincrement=True, primary_key=True), sa.

Neural Networks and Deep Learning 这本书主要讲的是如何掌握神经网络的核心概念,包括现代技术的深度学习,为你将来使⽤神经网络和深度学习打下基础,以下是我的读书笔记。 神经网络是一门重要的机器学习技术,它通过模拟人脑的神经网络来实现人工智能地目的,所以其也是深度学习的基础,了解它之后自然会受益颇多,本章主要是以识别手写字这个问题来贯穿整篇,那么,人类的视觉系统和神经网络到底在识别一个目标的时候,主要区别在哪? 人类视觉系统:通过数十亿年不断地进化与学习,最终能够极好地适应理解视觉世界的任务,从而无意识地就可以对目标进行判断识别 神经网络:通过提供的样本来推断出识别某种目标的规则,作为判断标准 本章的主要内容是介绍神经网络的基本概念以及引入一个识别手写数字的例子来加深我们的理解,你将了解到: 两个重要的人工神经元:感知器和S型神经元 神经⽹络的架构 ⼀个简单的分类⼿写数字的⽹络 标准的神经网络学习算法:随机梯度下降算法 感知器 1943年,心理学家McCulloch和数学家Pitts发表了《A logical calculus of the ideas immanent in nervous activity》,其中提出了抽象的神经元模型MP,但是在这个模型中权重都是要求提前设置好才可以输出目标值,所以很遗憾,它不可以学习,但这不影响此模型给后来者带来的影响,比如感知器: 感知器是Frank Rosenblatt提出的一个由两层神经元组成的人工神经网络,它的出现在当时可是引起了轰动,因为感知器是首个可以学习的神经网络 感知器的工作方式如下所示: $x_{1},x_{2},x_{3}$ 分别表示三个不同的二进制输入,output则是一个二进制输出,对于多种输入,可能有的输入成立有的不成立,在这么多输入的影响下,该如何判断输出output呢?Rosenblatt引入了权重。 对于$x_{1},x_{2},…,x_{j}$个输入,每个输入都有对应的权重$w_{1},w_{2},…,w_{j}$,最后的输出output由每个输入与其对应的权重相乘只和与阈值之差$\sum _{j} w{_j}x{_j}$来决定,如下: 假设$b=-threshold$且$w$和$x$对应权重和输⼊的向量,即: $x=(x_{1},x_{2},…,x_{j})$ $w=(w_{1},w_{2},…,w_{j})$ 那么感知器的规则可以重写为: 这就是感知器的数学模型,是不是就像一个逻辑回归模型?它的出现让我们可以设计学习算法,从而实现自动调整人工神经元的权重和偏置,与此同时output也会随之改变,这就是学习!如果你有兴趣可以看我用python写的一个感知器自动学习实现与非门,代码在这里。 说句题外话,由于感知器是单层神经网络,它只能实现简单的线性分类任务,所以它无法对异或问题进行分类,异或的真值表如下: $x$ $y$ $output$ 0 0 0 0 1 1 1 0 1 1 1 0 可以看出来,异或问题是线性不可分的,不信你画个坐标轴试试看,那么问题来了?怎么解决,大部分都能很快地想出解决方案,既然感知器可以实现线性分类,也就是说实现与非门是没有问题的,逻辑上来说我们可以实现任何逻辑功能,但前提是为感知器加入一个隐藏层,意思就是多了一个隐藏层的神经网络之后,就可以解决异或问题。

前面一节介绍项目结构的时候,很粗略地讲了下如何将rss的文章内容在网页上进行展示。 相信你应该已经了解清楚,sanic是怎么接收请求并返回被请求的资源的,简单来说概括如下: 接收请求 找到对应的路由并执行路由对应的视图函数 Jinja2模板渲染返回视图 路由和视图函数 在此我假设你理解 python 中的装饰器,如果你并不清楚,可以看我另写的关于装饰器的介绍,回归正题,还记得第一节中的代码实例么? #!/usr/bin/env python from sanic import Sanic from sanic.response import text app = Sanic() # 此处将路由 / 与视图函数 test 关联起来 @app.route("/") async def test(request): return text('Hello World!') if __name__ == "__main__": app.run(host="0.0.0.0", port=8000) 在前言介绍里,出现这几个名词 路由 视图函数 视图 ,在上面那段代码中,test 就是视图函数。 这是一段执行逻辑,比如客户端请求 0.0.0.0:8000/ 此时返回的内容就是由test 这个视图函数提供的。 在我看来,视图函数就是一个纽带,它起到承上启下的作用,那么,到底是怎样的承上启下呢?让我们结合代码(sanic0.1.2源码)来分析下: @app.route("/") async def test(request): return text('Hello World!') 这个路由装饰器的作用很简单,就是将 / 这个 uri 与视图函数test关联起来,或许你可以将路由想象成一个 dict,当客户端若请求 0.

Sanic是一个可以使用async/await语法编写项目的异步非阻塞框架,它写法类似于Flask,但使用了异步特性,而且还使用uvloop作为事件循环,其底层使用的是libuv,从而使 Sanic的速度优势更加明显。 如果你: 想深入了解Sanic,迫切想知道它的运行机制 直接阅读源码,做一些定制 学习 将Sanic-0.1.2阅读完后,我觉得你应该有以下基础再阅读源码才会理解地比较好: 理解装饰器 理解协程 Sanic-0.1.2 的核心文件如下: . ├── __init__.py ├── blueprints.py ├── config.py ├── exceptions.py ├── log.py ├── request.py ├── response.py ├── router.py ├── sanic.py ├── server.py └── utils.py 通过运行下面的示例,这些文件都会被我们看到它的作用,拭目以待吧。 simple_server.py 让我们从simple_server开始吧,代码如下: from sanic_0_1_2.src import Sanic from sanic_0_1_2.src.response import json app = Sanic(__name__) @app.route("/") async def test(request): return json({"test": True}) app.run(host="0.0.0.0", port=8000) 或许你直接把sanic_annotation项目直接clone到本地比较方便调试+理解: git clone https://github.com/howie6879/sanic_annotation cd sanic_annotation/sanic_0_1_2/examples/ 那么,现在一切准备就绪,开始阅读吧。

一个项目,在最外层他们应该是一样的,至少需要有: 文件夹 说明 docs 项目文档说明 src/pro_name 项目名称 tests 测试用例 README.md 项目介绍 requirements.txt 该项目依赖的第三方库 …… …… 那接下来需要讨论的,就是 src 的内部结构该是什么样的呢? 本章将写一个 rss 解析展示的项目用做演示。 2.1.普通的项目结构 一个普通的项目: 不需要添加后续模块功能 快速开发使用,不需要维护 无较复杂的前端需求 用完就走 那么就可以像 demo01 中一样,只需要添加一个 run.py 或者叫做 app.py 文件(反正这是一个启动文件,命名可随意),不论是配置、路由都写在一起就好了。 新建一个项目如下: sample01 ├── docs │ └── demo.md ├── src │ └── run.py ├── tests ├── .