乐趣区

关于后端:如何用Python搭建监控平台

监控和运维,是互联网工业链上十分重要的一环。监控的目标就是防患于未然。通过监控,咱们可能及时理解到企业网络的运行状态。一旦呈现安全隐患,你就能够及时预警,或者是以其余形式告诉运维人员,让运维监控人员有工夫解决和解决隐患,防止影响业务零碎的失常应用,将所有问题的本源扼杀在摇篮当中。

不过,万变不离其宗,运维工作最重要的就是保护零碎的稳定性。除了相熟使用各种进步运维效率的工具来辅助工作外,云资源费用治理、平安治理、监控等,都须要消耗不少精力和工夫。运维监控不是久而久之得来的,而是随着业务倒退的过程中同步和倒退的。

明天咱们就应用 Django 这个 Web 框架,来搭建一个简略的量化监控平台。

Django 简介和装置

Django 是用 Python 开发的一个收费开源的 Web 框架,能够用来疾速搭建优雅的高性能网站。它采纳的是“MVC”的框架模式,即模型 M、视图 V 和控制器 C。

Django 最大的特色,在于将网页和数据库中简单的关系,转化为 Python 中对应的简略关系。它的设计目标,是使常见的 Web 开发工作变得疾速而简略。Django 是开源的,不是商业我的项目或者科研项目,并且集中力量解决 Web 开发中遇到的一系列问题。所以,Django 每天都会在现有的根底上提高,以适应一直更迭的开发需要。这样既节俭了开发工夫,也进步了前期保护的效率。

说了这么多,接下来,咱们通过上手应用进一步来理解。先来看一下,如何装置和应用 Django。你能够先依照上面代码块的内容来操作,装置 Django:

pip3 install Django
django-admin --version

########## 输入 ##########

2.2.3

接着,咱们来创立一个新的 Django 我的项目:

django-admin startproject TradingMonitor
cd TradingMonitor/
python3 manage.py migrate

########## 输入 ##########
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK

这时,你能看到文件系统大略是上面这样的:

TradingMonitor/
├── TradingMonitor
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
└── manage.py

我简略解释一下它的意思:

  • 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 源代码被扭转后,如果咱们要将其利用到数据库上,就须要执行一次这个命令。

接下来,咱们为这个零碎增加管理员账户:

python3 manage.py createsuperuser

########## 输入 ##########

Username (leave blank to use 'ubuntu'): admin
Email address:
Password:
Password (again):
Superuser created successfully.

而后,咱们来启动 Django 的 debugging 模式:

python3 manage.py runserver

最初,关上浏览器输出: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 代码:

#  TradingMonitor/models.py

from django.db import models

class Position(models.Model):
    asset = models.CharField(max_length=10)
    timestamp = models.DateTimeField()
    amount = models.DecimalField(max_digits=10, decimal_places=3)

models.py 文件次要用一个 Python 类来形容数据表,称为模型。使用这个类,你能够通过简略的 Python 代码来创立、检索、更新、删除数据库中的记录,而不必写一条又一条的 SQL 语句,这也是咱们之前所说的防止通过 SQL 操作数据库。

在这里,咱们创立了一个 Position 模型,用来示意咱们的交易仓位信息。其中,

  • asset 示意以后持有资产的代码,例如 btc;
  • timestamp 示意工夫戳;
  • amount 则示意工夫戳时刻的持仓信息。

设计视图 Views

在模型被定义之后,咱们便能够在视图中援用模型了。通常,视图会依据参数检索数据,加载一个模板,并应用检索到的数据出现模板。

设计视图,则是咱们用来实现业务逻辑的中央。咱们来看 render\_positions 这个代码,它承受 request 和 asset 两个参数,咱们先不必管 request。这里的 asset 示意指定一个资产名称,例如 btc,而后这个函数返回一个渲染页面。

#  TradingMonitor/views.py

from django.shortcuts import render
from .models import Position

def render_positions(request, asset):
    positions = Position.objects.filter(asset = asset)
    context = {'asset': asset, 'positions': positions}
    return render(request, 'positions.html', context)

不过,这个函数具体是怎么工作的呢?咱们一行行来看。

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 在最终送给用户之前,须要被咱们事后解决一下,而事后解决的形式就是找到对应的中央进行替换。

咱们来看上面这段示例代码:

#  TradingMonitor/templates/positions.html

<!DOCTYPE html>
<html lang="en-US">
<head>
<title>Positions for {{asset}}</title>
</head>

<body>
<h1>Positions for {{asset}}</h1>

<table>
<tr>
    <th>Time</th>
    <th>Amount</th>
</tr>
{% for position in positions %}
<tr>
    <th>{{position.timestamp}}</th>
    <th>{{position.amount}}</th>
</tr>
{% endfor %}
</table>
</body>

我重点说一下几个中央。首先是 <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 接口,具体操作我放在了上面的代码中,内容比较简单,我就不具体开展解说了。

#  TradingMonitor/urls.py

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [path('admin/', admin.site.urls),
    path('positions/<str:asset>', views.render_positions),
]

到这里,咱们就能够通过 http://127.0.0.1:8000/positions/btc 来拜访啦!

测试

当然,除了次要流程外,我还须要强调几个很简略但十分要害的细节,不然,咱们这些扭转就不能被真正地利用。

第一步,在 TradingMonitor/TradingMonitor 下,新建一个文件夹 migrations;并在这个文件夹中,新建一个空文件 __init__.py

mkdir TradingMonitor/migrations
touch TradingMonitor/migrations/__init__.py

此时,你的目录构造应该长成上面这样:

TradingMonitor/
├── TradingMonitor
│   ├── migrations
│       └── __init__.py
│   ├── templates
│       └── positions.html
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── models.py
│   ├── views.py
│   └── wsgi.py
├── db.sqlite3
└── manage.py

第二步,批改 TradingMonitor/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'TradingMonitor',  # 这里把咱们的 app 加上
]
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'TradingMonitor/templates')],  # 这里把 templates 的目录加上
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

第三步,运行 python manage.py makemigrations

python manage.py makemigrations

########## 输入 ##########

Migrations for 'TradingMonitor':
  TradingMonitor/migrations/0001_initial.py
    - Create model Position

第四步,运行 python manage.py migrate

python manage.py migrate

########## 输入 ##########

Operations to perform:
  Apply all migrations: TradingMonitor, admin, auth, contenttypes, sessions
Running migrations:
  Applying TradingMonitor.0001_initial... OK

这几步的具体操作,我都用代码和正文示意了进去,你齐全能够同步进行操作。操作实现后,当初,咱们的数据结构就曾经被胜利同步到数据库中了。

最初,输出 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 搭建服务器是如此的简略呀!

本文由 mdnice 多平台公布

退出移动版