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的安装是不是很简单?事实上,这是Pytho一贯的理念,旨在言简意赅,简化准入门槛。
好的,现在让我们导航到http://127.0.0.1:8000/admin
。你会看到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结合产生很好的效果。典型的有:
- Graphite 是一个存储时间序列数据并通过 Django Web 应用程序以图表形式显示的插件;
- Vimeo 是一个基于 Graphite 的仪表板,具有额外的功能和流畅的设计;
- Scout 监控 Django 和 Flask 应用程序的性能,并提供视图、SQL 查询、模板等的自动检测。
总结
本文我们以Pytho的后端Django为例,讲解搭建服务器的过程。您应该已经发现,使用 RESTful Framework 构建服务器是如此简单!
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。