Code前端首页关于Code前端联系我们

Django搭建一个简单的量化监控平台

terry 2年前 (2023-09-24) 阅读数 66 #后端开发
Django构建了一个简单的量化监控平台、控制和运维,是互联网产业链条中非常重要的一环。监控的目的是防患于未然。通过监控,我们可以及时了解企业网络的运行状况。一旦出现安全隐患,可以提前预警或以其他方式告知运维人员,以便运维人员有时间处理和解决隐患,使公司的正常使用不受影响。制度,把一切问题的根源消灭在摇篮里。

然而,一切还是一样。运维工作最重要的是保持系统的稳定性。除了熟悉使用各种工具提高运维效率来支撑工作之外,云资源成本管理、安全管理、监控等都需要大量的精力和时间。运维的监控不是一朝一夕的事情,而是随着公司的发展而同步和演变。

今天我们将使用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,代表该项目原来的Pytho包;
  • TradingMonitor/init.py,代表一个空文件,声明该文件夹中的包是Pytho-n包;
  • TradingMonitor/settings.py,管理项目的配置信息;
  • TradingMonitor/urls.py,声明请求URL映射关系;
  • TradingMonitor/wsgi.py,代表Pytho程序与Web服务器之间的通信协议;
  • manage.py,代表用于与Django项目交互的命令行工具;
  • Db.sqlite3代表默认数据库,可以在设置中替换为其他数据库。

此外,您可能已经注意到上述命令中的python3 manage.py migrate。此命令创建或更新数据库架构。当模型的源代码更改并且我们想要将其应用到数据库时,我们必须运行一次此命令。

接下来我们为本系统添加一个管理员帐户:

python3 manage.py createsuperuser

########## 输出 ##########

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

然后我们启动 Django 的调试模式:

python3 manage.py runserver

最后,打开浏览器并输入: http://127.0.0.1:8000 。如果看到以下界面,说明Django已经部署成功。 Django搭建一个简单的量化监控平台

Django的安装是不是很简单?事实上,这是Pytho一贯的理念,旨在言简意赅,简化准入门槛。

好的,现在让我们导航到http://127.0.0.1:8000/admin。你会看到Django的后端管理网页,这里不再详细介绍。 Django搭建一个简单的量化监控平台Django搭建一个简单的量化监控平台

至此,Django已经安装成功并正常启动。

MVC架构

刚才说了,MVC架构是Django设计模式的精髓。接下来,让我们仔细看看这个架构,并通过 Django 构建一个服务器。

设计模型Model

peewee 这个库可以避免通过繁琐的SQL语句使用MySQL,直接使用Pytho的类进行转换。事实上,这就是Django的做法。

Django 可以在没有数据库的情况下使用。它仅使用 Pytho 代码使用对象关系映射来描述数据结构。

我们先看下面的模型代码:

#  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 类来描述数据表,称为模型。此类允许您使用简单的 Pytho 代码创建、检索、更新和删除数据库中的记录,而无需编写一条又一条的 SQL 语句。这就是我们前面所说的避免通过SQL管理数据库。

这里我们创建了一个仓位模型来表示我们的交易仓位信息。其中,

  • assets代表当前持有资产的代码,如btc;
  • timestamp表示时间戳;
  • amount表示时间戳时刻的位置信息。

设计视图

定义模型后,我们可以在视图中引用模型。通常,视图根据参数检索数据,加载模板,并使用检索到的数据呈现模板。

在设计视图中,我们实现业务逻辑。让我们看一下render_positions代码。它接受两个参数:请求和项目。我们还不必担心该请求。这里的资产是指你提供一个资产名称,比如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的意思是过滤,也就是说我们从数据库中选择所有我们需要的资产信息。不过,我这里只是给大家举个例子来演示一下;我们实际做监控的时候,通常会更有针对性地从数据库中过滤并读取信息,而不是一次读取所有信息。

context = {'asset': asset, 'positions':positiones},这行代码没什么好说的,它包含了一个字典。至于这本词典的用处,可以体现在以下内容中。

return render(request, 'positions.html', context),最后一行代码返回一个页面。我们这里使用的模板设计也是Django强烈推荐的开发方式,即将模板与数据分离,这样只需要将数据输入其中即可。

最终的模板文件是position.html。您应该已经注意到上下文作为变量传递给模板。我们来看看设计模板的内容。

设计模板

模板文件基本上是 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>

我重点关注几个地方。第一个是 {{asset}} 的位置,其中双花括号括起 asset 变量,该变量对应于先前上下文字典中的 asset 键。 Django的渲染引擎会将该item替换为上下文中与该item匹配的内容,这里用btc替换。

{%为位置%},这是一个非常关键的地方。如果我们正在处理一个列表,只需使用 for 来迭代位置。这里的位置也对应于上下文中的位置。

末尾的{% endfor %}显然是结束的意思。这样我们就将数据捆绑到一个列表中。

设计链接URL

最后,我们需要为我们的活动提供一个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下创建一个新的迁移文件夹;并在此文件夹中创建一个新的空文件 __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 migration:

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应用程序。对于一个真正量化的平台监控系统来说,这只是一个简单的开始。

另外,对于监控系统来说,其实有很多开源插件可以使用。有的界面非常炫酷,有的可以达到很高的稳定性和易用性,还有很多可以和Django结合产生很好的效果。典型的有:

  • Graphite 是一个存储时间序列数据并通过 Django Web 应用程序以图表形式显示的插件;
  • Vimeo 是一个基于 Graphite 的仪表板,具有额外的功能和流畅的设计;
  • Scout 监控 Django 和 Flask 应用程序的性能,并提供视图、SQL 查询、模板等的自动检测。

总结

本文我们以Pytho的后端Django为例,讲解搭建服务器的过程。您应该已经发现,使用 RESTful Framework 构建服务器是如此简单!

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门