Django入门教程:开始制作可视化疫情地图……太棒了!
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。浏览器
看到如上页面说明项目创建成功。
现在我们必须在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/
如果看到如上图页面,则说明成功。如果启动的服务关闭,请执行duma文件夹中的python manager.py runserver命令重新启动Web服务。
当您访问 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,重新执行建表命令即可。 。表的定义以及表的查询和更新逻辑根本不需要改变。
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 }}
此文件使用表格来显示数据。你会发现这不是一个纯HTML文件。准确地说,index.html是Django定义的模板语言。它支持根据特定语法编写Python代码,例如使用for循环和stat对象。
函数可以解析模板语言,生成干净的HTML文件,并将其返回给浏览器。
在浏览器中访问http://127.0.0.1:8000/ncov/,可以看到如下页面
虽然可以显示数据,但是有点难看,前端风格需要优化。
刚才提到的HTML和Django模板语言都是标记语言,其语法比较简单。之前没学过的朋友可以找一些教程来弥补。
要显示比较漂亮的图像一般都是使用js来实现的。有js基础知识的朋友可以自己写首页。如果没有,您可以使用 pyecharts ,它支持使用 Python 代码创建图表。
下载pyecharts GitHub项目源代码(https://github.com/pyecharts/pyecharts),并将“pyecharts/render/templates”文件夹中的源文件复制到“ncov/templates”文件夹中。结果如下
继续更改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了。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。