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

Django入门教程:开始制作可视化疫情地图……太棒了!

terry 2年前 (2023-09-25) 阅读数 54 #后端开发

Django 是一个 Python Web 框架,发音为 [ˈdʒæŋɡo],翻译成中文为“姜狗”。

为什么要学习框架?其实我们可以用Python代码从0到1写一个网站,但是那样的话我们就得写网络服务、数据库读写等底层代码。框架的作用就是把这些底层基础设施都建好了,我们只需要写业务逻辑就可以了。

例如,建筑物是一个框架。我们不关心底层的脚手架和钢筋混凝土是怎么搭建的。只要有这样一个框架,我们就可以生活在其中。我们关注的是里面的房间是如何设计和布置的。的。

1

Django入门

我使用的Python版本是3.8。首先运行以下语句安装Django

pip install Django

安装完成后,运行以下语句创建Django项目

django-admin startproject duma

名称可以自定义。我做的项目的名字是duma。执行

命令后,会在当前文件夹下生成duma文件夹,其中包含以下源文件。

duma/
manage.py
duma/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py

简单介绍下这些文件的功能:

  • manage.py:管理Django项目的命令行工具,就像工​​具箱一样,后面会经常用到
  • mysite/settings.py:django项目配置文件,例如:配置项目使用哪个数据库,包含哪些应用程序等。
  • mysite/urls.py:Django 项目的 URL 声明
  • mysite/asgi.py:当您的项目在 ASGI 兼容的平台上运行时服务器上的 Web 条目。当前未使用
  • mysite/wsgi.py:用作项目在符合 WSGI 的 Web 服务器上运行的入口点。暂时没有使用

在接下来的学习中我们将使用并修改上面的文件,然后我们将更深入地了解它们的作用。

运行以下命令启动Web服务并检查duma项目是否创建。

python manage.py runserver

执行命令,会看到如下信息输出

Startingdevelopment server at http://127.0.0.1:8000/

访问http://0.0.01:8.0。浏览器Django 入门练习教程:直接开干做个疫情可视化地图…牛逼牛逼!

看到如上页面说明项目创建成功。Django 入门练习教程:直接开干做个疫情可视化地图…牛逼牛逼!

现在我们必须在duma项目中创建一个应用程序(app)。一个项目中可以有多个应用程序。例如,一个电商项目可能有商城应用、支付应用、会员应用等。

执行此命令行创建一个应用程序

python manage.py startapp ncov

这里创建了一个名为ncov的应用程序,用于创建一个疫情数据报告。在项目根目录下会发现有一个ncov文件夹,里面有以下文件

ncov/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py

它们的功能暂时不介绍了。这些文件后面基本上都会用到,后面会详细介绍。

2

Hello, World

“Hello, World”是一个用于学习任何编程语言的演示程序。现在我们使用 Django 来实现一个“Hello, World”Web 应用程序。

首先在“nocv/views.py”文件中创建索引函数

from django.http import HttpResponse


def index(request):
return HttpResponse('Hello, World!')

然后在ncov文件夹中创建urls.py文件,该文件用于定义ncov应用程序中包含的url。例如:在一个电商购物应用中,会有商城网站的URL和产品详情的URL。

在urls.py文件中添加一个url,对应index函数。

from django.urls import path

from . import views

urlpatterns = [
path('', views.index, name='index'),
]

第一个参数是url的路径,其中空字符串代表ncov应用程序的根路径;第二个参数是url对应的view;第三个参数是url的名称,可以自定义。

在“duma/urls.py”中添加最终代码,以在duma项目中注册ncov应用程序的url。添加的代码如下

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('ncov/', include('ncov.urls')),

]

在浏览器中访问ncov应用根路径http://127.0.0.1:8000/ncov/Django 入门练习教程:直接开干做个疫情可视化地图…牛逼牛逼!

如果看到如上图页面,则说明成功。如果启动的服务关闭,请执行duma文件夹中的python manager.py runserver命令重新启动Web服务。 Django 入门练习教程:直接开干做个疫情可视化地图…牛逼牛逼!

当您访问 ncov 应用程序的根路径时,浏览器会生成 http 请求。 duma项目Web服务收到请求后,会根据urls.py函数中的配置调用“ncov/views.py”文件的索引来处理请求。 index函数使用HttpResponse将字符串“Hello, World”构造成http响应结果并返回给浏览器。浏览器收到响应结果后,在页面上显示“Hello World”字符。绳索。

如果你细心的话,你会发现 HttpResponse('Hello, World!') 和 print('Hello, World') 非常相似。后者是我们学习Python语言时的第一个演示程序。两者都会发出字符串“Hello, World”,前者在浏览器中发出,后者在控制台(命令行)上发出。

这就是框架的力量。我们只关注业务逻辑。底层的http请求如何,如何响应,如何返回给浏览器,都是框架帮我们完成的。

3

连接数据库

电子商务网站会显示许多产品,这些产品详细信息存储在数据库中。同样,ncov应用程序也必须将流行病统计数据存储在数据库中。

打开文件“duma/settings.py”,找到DATABASE配置如下

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}

这里有一些默认配置。

“default.ENGINE”表示数据库引擎是sqlite3,这是一个轻量级数据库。您还可以将数据库引擎更改为MySQL、MongoDB等。

“default.NAME”是数据库名称。对于sqlite数据库,在这里填写数据库的路径。 BASE_DIR 代表项目的根目录。此时,如果查看项目的根目录,可以找到由Django创建的文件db.sqlite3。 ,稍后我们将用它来存储数据。

不知道你是否有这样的疑问。为什么数据库被称为文件?其实数据库的底层是文件,只是在文件之上构建了一个引擎,将文件的内容以表格的形式展现出来,并提供增、删、改、查功能。就像程序员本质上也是人,只不过因为从事编程工作而被称为程序员。

有了数据库,还必须在数据库中创建表。一般情况下,可以直接使用数据库命令来创建表。但既然我们使用的是框架,那么我们可以使用Django来操作它。

在文件“ncov/models.py”中创建Django模型

from django.db import models


class CyStat(models.Model):
stat_dt = models.CharField(max_length=10) # 日期
cy_name = models.CharField(max_length=50) # 国家名称
confirm = models.integerField() # 累计确诊
dead = models.IntegerField() # 累计死亡
heal = models.IntegerField() # 累计治愈
today_confirm = models.IntegerField() # 现有确诊
today_new_confirm = models.IntegerField() # 新增确诊

这里定义的CyStat类用于表示各个国家每日的疫情统计。包含 7 个属性,使用模型中的类对象进行初始化。

stat_dt 和 cy_name 定义为 models.CharField 类型,表示字符类型。日期格式为2021-11-01,占用10个字符,所以max_length=10;对于国家名称,它通常不超过 50 个字符,因此它的 max_length=50。

其他字段都是统计数据,用整数即可。

拥有数据模型只是第一步。我们如何获取数据?此时,您需要将模型与数据库中的表关联起来。

首先,在duma项目中注册ncov应用,在“duma/settings.py”文件中找到INSTALLED_APPS配置,在数组中添加ncov应用。添加完成后INSTALLED_APPS数组如下

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'ncov.apps.NcovConfig' # 注册 ncov 应用
]

然后运行以下命令

python manage.py makemigrations ncov

执行后可以看到如下信息输出

Migrations
for 'ncov':
  ncov/migrations/0001_initial.py
    - Create model CyStat

该命令会在“ncommigration”目录下创建文件0001_initial.py/。如果你看源码,你可能看不到它的功能。我们可以执行下面的语句来转换它。转换成sql就很容易理解了。执行

python manage.py sqlmigrate ncov 0001

后,输出

BEGIN;
--
-- Create model CyStat
--
CREATE TABLE "ncov_cystat" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "stat_dt" varchar(10) NOT NULL, "cy_name" varchar(50) NOT NULL, "confirm" integer NOT NULL, "dead" integer NOT NULL, "heal" integer NOT NULL, "today_confirm" integer NOT NULL, "today_new_confirm" integer NOT NULL);
COMMIT;

可见,实际上是一条建表sql。表名是应用程序名称和模型类名称的组合,并用下划线连接。除了自动添加id外,其他字段名称和定义与模型类属性一致。

最后执行以下命令即可完成建表操作

python manage.py migrate

我们可以打开数据库db.sqlite3查看是否成功。 Mac电脑自带sqlite3命令,可以直接打开。 Windows 计算机可以安装 SQLite Administrator 客户端。

在项目根文件夹中运行,打开数据库文件

sqlite3 db.sqlite3

执行.tables 查看数据库中的表

sqlite> .tables
auth_group django_admin_log
auth_group_permissions django_content_type
auth_permission django_migrations
auth_user django_session
auth_user_groups ncov_cystat
auth_user_user_permissions

可以找到名为ncov_cystat的表,该表是根据CyStat类创建的表。此外,Django框架还附带了许多其他表,我们暂时可以忽略它们。

这样我们就将模型CyStat类与数据库中的ncov_cystat表对应起来。随后,如果我们需要查询或者更改数据,我们可以直接操作CyStat类,无需编写sql。

这里我们可以发现使用Django框架的另一个好处——将模型类与数据库隔离(行话称为解耦)。这样做的好处是,如果以后我们的项目上线后想把sqlite数据库替换成MySQL,只需要在settings.py文件中将数据库引擎和数据库名称改为DATABASES,重新执行建表命令即可。 。表的定义以及表的查询和更新逻辑根本不需要改变。 Django 入门练习教程:直接开干做个疫情可视化地图…牛逼牛逼!

4

编写网页

在上一节中,我们将编写一个网页来显示数据。有了上面的基础,我们知道在views.py文件中查询ncov_cystat表数据,然后将数据返回给浏览器。

首先您需要将一些数据导入到 ncov_cystat 表中。大家可以参考之前的文章《用Python绘制全球疫情变化地图》自己去抢。

我还准备了一些数据,放到了源码包“ncov/sql/insert Epidemic data.sql”中。复制1~60行sql并在sqlite客户端上运行。

sqlite> insert into ncov_cystat(stat_dt, cy_name, confirm, dead, heal, today_confirm, today_new_confirm) VALUES ("2021-09-03", "cn", 123169, 5685, 115024, 2460, 33);
sqlite> insert into ncov_cystat(stat_dt, cy_name, confirm, dead, heal, today_confirm, today_new_confirm) VALUES ("2021-09-04", "cn", 123199, 5685, 115105, 2409, 30);
...

读取数据并返回给浏览器。更改文件“ncov/views.py”中的索引函数

from django.shortcuts import render

from .models import CyStat


def index(request):
cy_stats = CyStat.objects.filter(cy_name='cn').order_by('-stat_dt')[:7]
context = {
'cy_stats': cy_stats
}

return render(request, 'ncov/index.HTML', context)

CyStat.objects 将返回 ncov_cystat 表中的所有条目。 Filter用于按字段过滤表中的数据。 'cn' 代表中国,cy_name='cn' 表示我们只存储国内数据。 order_by 用于对返回结果按特定字段(列)进行排序。在字段名称前添加“-”表示降序排列。这里我们只获取最近 7 天的数据。

现在我们不能直接将其返回为“Hello, World”,因为那样会返回一个没有任何样式的字符串。我们返回的必须是一个HTML文件,所以我们需要调用reder函数并返回“ncov/index.html”。 ? .stat_dt }}

{{ stat.today_confirm }}{{ stat.today_new_confirm }}

此文件使用表格来显示数据。你会发现这不是一个纯HTML文件。准确地说,index.html是Django定义的模板语言。它支持根据特定语法编写Python代码,例如使用for循环和stat对象。

函数可以解析模板语言,生成干净的HTML文件,并将其返回给浏览器。

在浏览器中访问http://127.0.0.1:8000/ncov/,可以看到如下页面Django 入门练习教程:直接开干做个疫情可视化地图…牛逼牛逼!

虽然可以显示数据,但是有点难看,前端风格需要优化。Django 入门练习教程:直接开干做个疫情可视化地图…牛逼牛逼!

刚才提到的HTML和Django模板语言都是标记语言,其语法比较简单。之前没学过的朋友可以找一些教程来弥补。

要显示比较漂亮的图像一般都是使用js来实现的。有js基础知识的朋友可以自己写首页。如果没有,您可以使用 pyecharts ,它支持使用 Python 代码创建图表。

下载pyecharts GitHub项目源代码(https://github.com/pyecharts/pyecharts),并将“pyecharts/render/templates”文件夹中的源文件复制到“ncov/templates”文件夹中。结果如下Django 入门练习教程:直接开干做个疫情可视化地图…牛逼牛逼!

继续更改index函数,使用pyecharts API返回折线图。

from django.http import HttpResponse
from django.shortcuts import render
from pyecharts.charts import Line, Map
from pyecharts import options as opts

from .models import CyStat


def index(request):
cy_stat = CyStat.objects.filter(cy_name='cn').order_by('-stat_dt')[:14]

stat_list = [x.stat_dt for x in cy_stat]
stat_list.reverse()

today_confirm_list = [x.today_confirm for x in cy_stat]
today_confirm_list.reverse()

today_new_confirm_list = [x.today_new_confirm for x in cy_stat]
today_new_confirm_list.reverse()

c = (
Line()
.add_xaxis(stat_list)
.add_yaxis("现有确诊", today_confirm_list)
.add_yaxis("新增确诊", today_new_confirm_list)
.set_global_opts(title_opts=opts.TitleOpts())
)
return HttpResponse(c.render_embed())

副作用如下Django 入门练习教程:直接开干做个疫情可视化地图…牛逼牛逼!

这样的效果绝对没错。 Django 入门练习教程:直接开干做个疫情可视化地图…牛逼牛逼!

学完这些,我们就已经开始使用Django了。

版权声明

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

发表评论:

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

热门