39 | Django:搭建监控平台
下载APP
关闭
渠道合作
推荐作者
39 | Django:搭建监控平台
2019-08-07 景霄 来自北京
《Python核心技术与实战》
课程介绍
讲述:冯永吉
时长10:46大小9.86M
你好,我是景霄。
通过前几节课的学习,相信你对量化交易系统已经有了一个最基本的认知,也能通过自己的代码,搭建一个简单的量化交易系统来进行盈利。
前面几节课,我们的重点在后台代码、中间件、分布式系统和设计模式上。这节课,我们重点来看前端交互。
监控和运维,是互联网工业链上非常重要的一环。监控的目的就是防患于未然。通过监控,我们能够及时了解到企业网络的运行状态。一旦出现安全隐患,你就可以及时预警,或者是以其他方式通知运维人员,让运维监控人员有时间处理和解决隐患,避免影响业务系统的正常使用,将一切问题的根源扼杀在摇篮当中。
在硅谷互联网大公司中,监控和运维被称为 SRE,是公司正常运行中非常重要的一环。作为 billion 级别的 Facebook,内部自然也有着大大小小、各种各样的监控系统和运维工具,有的对标业务数据,有的对标服务器的健康状态,有的则是面向数据库和微服务的控制信息。
不过,万变不离其宗,运维工作最重要的就是维护系统的稳定性。除了熟悉运用各种提高运维效率的工具来辅助工作外,云资源费用管理、安全管理、监控等,都需要耗费不少精力和时间。运维监控不是一朝一夕得来的,而是随着业务发展的过程中同步和发展的。
作为量化实践内容的最后一节,今天我们就使用 Django 这个 Web 框架,来搭建一个简单的量化监控平台。
Django 简介和安装
Django 是用 Python 开发的一个免费开源的 Web 框架,可以用来快速搭建优雅的高性能网站。它采用的是“MVC”的框架模式,即模型 M、视图 V 和控制器 C。
Django 最大的特色,在于将网页和数据库中复杂的关系,转化为 Python 中对应的简单关系。它的设计目的,是使常见的 Web 开发任务变得快速而简单。Django 是开源的,不是商业项目或者科研项目,并且集中力量解决 Web 开发中遇到的一系列问题。所以,Django 每天都会在现有的基础上进步,以适应不断更迭的开发需求。这样既节省了开发时间,也提高了后期维护的效率。
说了这么多,接下来,我们通过上手使用进一步来了解。先来看一下,如何安装和使用 Django。你可以先按照下面代码块的内容来操作,安装 Django :
接着,我们来创建一个新的 Django 项目:
这时,你能看到文件系统大概是下面这样的:
我简单解释一下它的意思:
TradingMonitor/TradingMonitor,表示项目最初的 Python 包;
TradingMonitor/init.py,表示一个空文件,声明所在目录的包为一个 Python 包;
TradingMonitor/settings.py,管理项目的配置信息;
TradingMonitor/urls.py,声明请求 URL 的映射关系;
TradingMonitor/wsgi.py,表示 Python 程序和 Web 服务器的通信协议;
manage.py,表示一个命令行工具,用来和 Django 项目进行交互;
Db.sqlite3,表示默认的数据库,可以在设置中替换成其他数据库。
另外,你可能注意到了上述命令中的python3 manage.py migrate,这个命令表示创建或更新数据库模式。每当 model 源代码被改变后,如果我们要将其应用到数据库上,就需要执行一次这个命令。
接下来,我们为这个系统添加管理员账户:
然后,我们来启动 Django 的 debugging 模式:
最后,打开浏览器输入:http://127.0.0.1:8000。如果你能看到下面这个画面,就说明 Django 已经部署成功了。
Django 的安装是不是非常简单呢?这其实也是 Python 一贯的理念,简洁,并简化入门的门槛。
OK,现在我们再定位到 http://127.0.0.1:8000/admin,你会看到 Django 的后台管理网页,这里我就不过多介绍了。
到此,Django 就已经成功安装,并且正常启动啦。
MVC 架构
刚刚我说过,MVC 架构是 Django 设计模式的精髓。接下来,我们就来具体看一下这个架构,并通过 Django 动手搭建一个服务端。
设计模型 Model
在之前的日志和存储系统这节课中,我介绍过 peewee 这个库,它能避开通过繁琐的 SQL 语句来操作 MySQL,直接使用 Python 的 class 来进行转换。事实上,这也是 Django 采取的方式。
Django 无需数据库就可以使用,它通过对象关系映射器(object-relational mapping),仅使用 Python 代码就可以描述数据结构。
我们先来看下面这段 Model 代码:
models.py 文件主要用一个 Python 类来描述数据表,称为模型 。运用这个类,你可以通过简单的 Python 代码来创建、检索、更新、删除数据库中的记录,而不用写一条又一条的 SQL 语句,这也是我们之前所说的避免通过 SQL 操作数据库。
在这里,我们创建了一个 Position 模型,用来表示我们的交易仓位信息。其中,
asset 表示当前持有资产的代码,例如 btc;
timestamp 表示时间戳;
amount 则表示时间戳时刻的持仓信息。
设计视图 Views
在模型被定义之后,我们便可以在视图中引用模型了。通常,视图会根据参数检索数据,加载一个模板,并使用检索到的数据呈现模板。
设计视图,则是我们用来实现业务逻辑的地方。我们来看 render_positions 这个代码,它接受 request 和 asset 两个参数,我们先不用管 request。这里的 asset 表示指定一个资产名称,例如 btc,然后这个函数返回一个渲染页面。
不过,这个函数具体是怎么工作的呢?我们一行行来看。
positions = Position.objects.filter(asset = asset),这行代码向数据库中执行一个查询操作,其中, filter 表示筛选,意思是从数据库中选出所有我们需要的 asset 的信息。不过,这里我只是为你举例做示范;真正做监控的时候,我们一般会更有针对性地从数据库中筛选读取信息,而不是一口气读取出所有的信息。
context = {'asset': asset, 'positions': positions},这行代码没什么好说的,封装一个字典。至于这个字典的用处,下面的内容中可以体现。
return render(request, 'positions.html', context),最后这行代码返回一个页面。这里我们采用的模板设计,这也是 Django 非常推荐的开发方式,也就是让模板和数据分离,这样,数据只需要向其中填充即可。
最后的模板文件是 position.html,你应该注意到了, context 作为变量传给了模板,下面我们就来看一下设计模板的内容。
设计模板 Templates
模板文件,其实就是 HTML 文件和部分代码的综合。你可以想象成,这个 HTML 在最终送给用户之前,需要被我们预先处理一下,而预先处理的方式就是找到对应的地方进行替换。
我们来看下面这段示例代码:
我重点说一下几个地方。首先是<title>Positions for {{asset}}</title>,这里双大括号括住 asset 这个变量,这个变量对应的正是前面 context 字典中的 asset key。Django 的渲染引擎会将 asset ,替换成 context 中 asset 对应的内容,此处是替换成了 btc。
再来看{% for position in positions %},这是个很关键的地方。我们需要处理一个列表的情况,用 for 对 positions 进行迭代就行了。这里的 positions ,同样对应的是 context 中的 positions。
末尾的{% endfor %},自然就表示结束了。这样,我们就将数据封装到了一个列表之中。
设计链接 Urls
最后,我们需要为我们的操作提供 URL 接口,具体操作我放在了下面的代码中,内容比较简单,我就不详细展开讲解了。
到这里,我们就可以通过 http://127.0.0.1:8000/positions/btc 来访问啦!
测试
当然,除了主要流程外,我还需要强调几个很简单但非常关键的细节,不然,我们这些改变就不能被真正地应用。
第一步,在 TradingMonitor/TradingMonitor 下,新建一个文件夹 migrations;并在这个文件夹中,新建一个空文件 __init__.py。
此时,你的目录结构应该长成下面这样:
第二步,修改 TradingMonitor/settings.py:
第三步,运行 python manage.py makemigrations:
第四步,运行 python manage.py migrate:
这几步的具体操作,我都用代码和注释表示了出来,你完全可以同步进行操作。操作完成后,现在,我们的数据结构就已经被成功同步到数据库中了。
最后,输入 python manage.py runserver,然后打开浏览器输入http://127.0.0.1:8000/positions/btc,你就能看到效果啦。
现在,我们再回过头来看一下 MVC 模式,通过我画的这张图,你可以看到,M、V、C 这三者,以一种插件似的、松耦合的方式连接在一起:
当然,我带你写的只是一个简单的 Django 应用程序,对于真正的量化平台监控系统而言,这还只是一个简单的开始。
除此之外,对于监控系统来说,其实还有着非常多的开源插件可以使用。有一些界面非常酷炫,有一些可以做到很高的稳定性和易用性,它们很多都可以结合 Django 做出很好的效果来。比较典型的有:
Graphite 是一款存储时间序列数据,并通过 Django Web 应用程序在图形中显示的插件;
Vimeo 则是一个基于 Graphite 的仪表板,具有附加功能和平滑的设计;
Scout 监控 Django 和 Flask 应用程序的性能,提供自动检测视图、SQL 查询、模板等。
总结
这一节课的内容更靠近上游应用层,我们以 Django 这个 Python 后端为例,讲解了搭建一个服务端的过程。你应该发现了,使用 RESTful Framework 搭建服务器,是一个如此简单的过程,你可以去开一个自己的交易所了(笑)。相比起具体的技术,今天我所讲的 MVC 框架和 Django 的思想,更值得你去深入学习和领会。
思考题
今天我想给你留一个难度比较高的作业。RESTful API 在 Django 中是如何实现安全认证的?你能通过搜索和自学掌握这个知识点吗?希望可以在留言区看到你的认真学习记录和总结,我会一一给出建议。也欢迎你把这篇文章分享给你的朋友、同事,一起交流、一起进步。
分享给需要的人,Ta购买本课程,你将得18元
生成海报并分享
赞 15
提建议
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
上一篇
38 | MySQL:日志和数据存储系统
下一篇
40 | 总结:Python中的数据结构与算法全景
精选留言(24)
- Jingxiao置顶2019-08-19常用的认证方式有,HTTP Basic Auth,OAuth,Cookie Auth,Token Auth,而 Django Restful 一种常用的方式是 JSON Web Token(JWT),这是一个非常轻巧的规范,可以参考 https://github.com/jpadilla/django-rest-framework-jwt.25
- Kuzaman2019-08-07建议老师以后能专门出一个实战栏目,必顶共 1 条评论30
- 图·美克尔2019-08-15MVC在Django中对应的是MTV19
- 奥特虾不会写代码2019-08-07老师的专栏是我在极客时间看过的质量最高的专栏了,文字简单易懂,又不失深度,不知道以后会不会专门出一个量化交易的专栏,一定支持!共 4 条评论14
- TKbook2019-08-07貌似还缺少一步,添加相关数据。共 2 条评论6
- 小侠龙旋风2019-09-10老师,我本地的django版本是1.11.8,没法运行你的最新版本。 指出一个错误:不用手动创建migrations文件夹。执行python3 manage.py makemigrations命令就会生成了。 有个问题:这个url的正则表达式我不太懂“path('positions/<str:asset>', views.render_positions)”,<str:asset>不是一般都写成(?P<asset>[a-zA-Z]+)这样子的嘛? 作业回答: 因为http协议是无状态的,每次请求都是一次新的请求,不会记得之前通信的状态。所以需要一些特殊手段来记录状态。 方法一:把userinfo存储在request.session中,每次请求进行验证userinfo; 方法二:jwt生成一个包含用户信息的token令牌,并设置过期时间,每次处理客户端请求先验证是否请求头中带有token,要是有token解析出来的用户信息是否正确,以此来确定用户的登录状态。展开
作者回复: 棒
5 - 夜月不挂科2019-08-07django会自动生成一个csrf字段用来认证。共 1 条评论3
- 路伴友行2019-08-12DRF 有自带的token验证,也可以自己写中间件实现拦截2
- 旗木卡卡2019-08-07不知不觉已经学习了40讲,专栏马上就结束了,还没学够!2
- 山雨淋淋2020-11-02监控系统的稳定性谁来保证,监控监控系统本身?1
- 林润娥是我女朋友2020-10-19Django是MVT,虽然是从MVC演变的,但还是有必要区别开1
- Rs先生2020-08-30请教老师一个问题,我用的是python2.7,然后Django的版本为1.11.29,但是在最后访问url的是时候的显示page not found。这个是什么原因呢?1
- 追风筝的人2020-08-12pip3 install Django django-admin --version ########## 输出 ########## 2.2.3 老师 django的这些命令再Windows CMD命令框执行后不行,访问不了https://127.0.0.1:8000, 再centos 执行完所有代码 启动后django 服务,命令显示[root@localhost TradingMonitor]# python3 manage.py runserver Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). August 12, 2020 - 15:59:14 Django version 3.1, using settings 'TradingMonitor.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. ,但是浏览器访问失败 是什么原因展开共 1 条评论1
- Geek_aa780e2020-08-05可以讲一下在web项目中,对于非法情况,比如说数据库链接错误报的异常,该怎么处理吗? 是直接抛到handler层,还是在哪进行捕获?1
- 皮皮侠2020-04-14django好像是基于MVT模型,不过跟MVC差不多1
- 姑苏小沈🏃🎸2020-04-08请教一个Sqlalchemy的更新数据问题: 我创建一个session后,session. query(User). filter(ID=user_id). first() 明明能找到一条数据,但是执行 user.Name = 'my nam' session. commit()时却提示 expected to update 1 row: 0 were matched1
- 拾掇拾掇2019-08-14DRF好像好久没更新了,不支持Django2.0。不知道有什么框架可以替代1
- jxs12112019-08-08目前流行前后端分离,通过http通信,独立部署,不知在fackbook也是这样,另外想了解下python做后端有什么比较好的推荐书籍可供学习吗
作者回复: fb是通过graphql连接前后端。前后端也是独立开发。做后端不需要看什么书籍,不如多操作,多看一些优秀的代码
2 - 落雨2021-09-07按照文档操作,最后一直提示no such table: TradingMonitor_position .感觉很多地方都没讲清楚.这课感觉有点不值
- Geek_a861752019-12-25有的文章说创建项目后,还应该创建应用,一个大的业务模块作为一个APP,这个文章好像没有提及这块