前面一节介绍项目结构的时候,很粗略地讲了下如何将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 ├── .

对于一个项目来说,配置是一个很严肃的问题,比如说:在开发环境和生产环境中,配置是不同的,那么一个项目该如何自由地在不同的配置环境中进行切换呢,思考下,然后带着答案或者疑问往下阅读。 新建文件夹 demo2 ,内部建立这样的文件结构: demo02 ├── config │ ├── __init__.py │ └── config.py └── run.py 其中 run.py 内容如下: #!/usr/bin/env python from sanic import Sanic from sanic.response import text app = Sanic() @app.route("/") async def test(request): return text('Hello World!') if __name__ == "__main__": app.run(host="0.0.0.0", port=8000, debug=True) 代码示例中开启了 debug 模式,假设我们需要通过 config.py 配置文件来实现控制服务的 debug 模式开启与否,那该怎么实现呢。 在 config.py 中添加一行:DEBUG=True ,然后 run.py 内容改为: #!/usr/bin/env python from sanic import Sanic from sanic.response import text from config import DEBUG app = Sanic() @app.

在安装Sanic之前,让我们一起来看看Python在支持异步的过程中,都经历了哪些比较重大的更新。 首先是Python3.4版本引入了asyncio,这让Python有了支持异步IO的标准库,而后3.5版本又提供了两个新的关键字async/await,目的是为了更好地标识异步IO,让异步编程看起来更加友好,最后3.6版本更进一步,推出了稳定版的asyncio,从这一系列的更新可以看出,Python社区正迈着坚定且稳重的步伐向异步编程靠近。 安装 Sanic是一个支持 async/await 语法的异步无阻塞框架,这意味着我们可以依靠其处理异步请求的新特性来提升服务性能,如果你有Flask框架的使用经验,那么你可以迅速地使用Sanic来构建出心中想要的应用,并且性能会提升不少,我将同一服务分别用Flask和Sanic编写,再将压测的结果进行对比,发现Sanic编写的服务大概是Falsk的1.5倍。 仅仅是Sanic的异步特性就让它的速度得到这么大的提升么?是的,但这个答案并不标准,更为关键的是Sanic使用了uvloop作为asyncio的事件循环,uvloop由Cython编写,它的出现让asyncio更快,快到什么程度?这篇文章中有介绍,其中提出速度至少比 nodejs、gevent 和其他Python异步框架要快两倍,并且性能接近于用Go编写的程序,顺便一提,Sanic的作者就是受这篇文章影响,这才有了Sanic。 怎么样?有没有激起你学习Sanic的兴趣,如果有,就让我们一起开始学习吧,在开始之前,你只需要有一台安装了Python的电脑即可。 说明:由于Windows下暂不支持安装uvloop,故在此建议使用Mac或Linux 虚拟环境 程序世界一部分是对应着现实的,在生活中,我们会在不同的环境完成不同的任务,比如在厨房做饭、卧室休息,分工极其明确。 其实用Python编写应用服务也是如此,它们同样希望应用服务与开发环境是一对一的关系,这样做的好处在于,每个独立的环境都可以简洁高效地管理自身对应服务所依赖的第三方库,如若不然,各个服务都安排在同一环境,这样不仅会造成管理上的麻烦,还会使第三方库之间产生冲突。 通过上面的叙述,我们是不是可以得出这样一个核心观点:应该在不同的环境下做不同的事 ,以此类推,写项目的时候,我们也需要为每个不同的项目构建一个无干扰的的环境,发散思维,总结一下: 不同的项目,需要为其构建不同的虚拟环境,以免互相干扰 构建虚拟环境的工具很多,如下: virtualenv pyenv anaconda …… 以上三个工具都可以快速地帮助我们构建当前需要的Python环境,如果你之前没有使用过,可直接点开链接进行下载,如果你正在使用其它的环境管理工具,也不要紧,因为不论你使用哪一种方式,我们最终目的都是针对一个新项目构建一个新的环境。 安装配置好之后,简单看看官方提供的使用方法,就可以开始了,比如我本机使用的是anaconda ,安装完成后可以很方便地创建一个虚拟环境,比如这里使用Python3.6来作为本书项目的默认环境: # 新建一个python3.6环境 conda create --name python36 python=3.6 # 安装好之后 输入下面命令进入名为python36的环境 source activate python36 若安装速度比较慢,可以考虑换国内源,比如 国内镜像 ,至于为什么选择python3.6作为默认环境,一是因为Sanic只支持Python3.5+,二则是我们构建的项目最终是要在生产环境下运行的,所以建议最好安装Python3.6下稳定版本的asyncio。 安装Sanic Python安装第三方模块都是利用pip工具进行安装,这里也不例外,首先进入上一步我们新建的 python3.6 虚拟环境,然后安装: # 安装Sanic,请先使用 source activate python36 进入虚拟环境 pip install sanic # 如果不想使用uvloop和ujson 可以这样安装 SANIC_NO_UVLOOP=true SANIC_NO_UJSON=true pip install sanic 通过上面的命令,你就可以在 python3.

上一篇笔记1.Docker - 初使用 主要介绍了Docker的安装以及一个简单的运行例子,本次笔记主要通过具体的实例来介绍一些Docker镜像以及容器的基本操作 1.目标 之前的毕设owllook是用python编写的,我将它开源在github上,正借此机会,将其制作成Docker镜像,以便部署 本次笔记就以此项目为中心,目标是将该项目制作成Docker镜像,并从过程中一步步熟悉Docker 2.定制镜像 上一篇笔记中说了,镜像是由一系列指令一步一步构建出来,但是,最初的镜像我们还是需要从镜像仓库获取,比如owllook基于python3.6,那么我第一步便是从镜像仓库获取python镜像 运行命令:docker pull python:3.6 稍等片刻,就会拉取一个python3.6的镜像下来,让我们以这个镜像为基础来启动一个容器: # 具体可参考 dcker run --help 来了解详细命令 docker run -it --rm python:3.6 python # 终端会有如下输出 此时进入了容器中的3.6环境 Python 3.6.2 (default, Jul 24 2017, 19:47:39) [GCC 4.9.2] on linux Type "help", "copyright", "credits" or "license" for more information. >>> # 也可以直接进入容器 docker run -it --rm python:3.6 有了基础镜像,下面我们有两种方案构建owllook镜像: 使用docker commit 命令 Dockerfile(使用此方案) Dockerfile内容如下: # 基于python3.6镜像来构建owllook镜像 FROM python:3.6 MAINTAINER howie6879 <howie6879@gmail.