关于python:Django入门教程做个疫情数据报告

4次阅读

共计 8166 个字符,预计需要花费 21 分钟才能阅读完成。

Django 是 Python web 框架,发音 [ˈdʒæŋɡo],翻译成中文叫“姜狗”。为什么要学框架?其实咱们本人齐全能够用 Python 代码从 0 到 1 写一个 web 网站,但那样就要写网络服务、数据库读写等底层代码。而框架的作用是把这些底层基建曾经搭建好了,咱们只写业务逻辑即可。

举个例子,楼房就是框架,咱们不关怀底层的脚手架、钢筋水泥是如何搭建的,只有有了这样的框架咱们就能够住进去,而外面的房间要怎么设计、装璜才是咱们关怀的。

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

执行命令,会看到有以下信息输入

Starting development server at http://127.0.0.1:8000/

在浏览器拜访 http://127.0.0.1:8000/ 

看到下面的页面,阐明我的项目创立胜利。

接下来咱们要在 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”文件中创立 index 函数

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 对应的视图;第三个参数是该 url 的名称,可自定义。最初,在“duma/urls.py”增加代码,将 ncov 利用的 url 注册到 duma 我的项目中,增加后的代码如下

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 函数来解决该申请,index 函数中用 HttpResponse 将字符串“Hello, World”结构为一个 http 响应后果并返回给浏览器,浏览器接到该响应后果后,在页面上显示“Hello, World”字符串。

仔细的话,你会发现 HttpResponse(‘Hello, World!’) 跟 print(‘Hello, World’) 很像,后者是咱们学习 Python 语言时第一个演示程序。它俩都是输入“Hello, World”字符串,前者输入在浏览器上,后者输入在控制台(命令行)上。这就是框架的威力,咱们只关注业务逻辑,底层的 http 如何申请、如何响应以及如何返回给浏览器都是框架帮咱们做好了。

3 连贯数据库

一个电商网站会展示很多商品,这些商品信息都存储在数据库中。同样的,ncov 利用也须要把疫情统计数据存储在数据库中。

关上“duma/settings.py”文件,找到 DATABASES 配置,如下

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

这里有一些默认的配置。“default.ENGINE”代表数据库引擎是 sqlite3,是一个轻量数据库。你也能够将数据库引擎改成 MySQL、MongoDB 等。“default.NAME”是数据库名称,对于 sqlite 数据库来说这里填数据库的门路,BASE_DIR 代表我的项目根目录,此时再看下我的项目根目录能够发现有 db.sqlite3 文件,它是 Django 创立的,前面咱们就用它来存储数据。不晓得你会不会有这样的疑难,说好的数据库,怎么是个文件?

实际上数据库的底层就是文件,只不过是在文件之上建设了一套引擎能够将文件中的内容以表格展现,并提供减少、删除、批改、查找的性能。就好比程序员的实质也是人,只不过从事编程工作所以被称为程序员。有了数据库,还须要在数据库里创立表。一般来说,能够用数据库命令间接建表。但因为咱们用的是框架,所以就能够用 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 个属性,用 models 中的类对象来初始化。stat_dt 和 cy_name 定义为 models.CharField 类型,代表字符类型。日期是 2021-11-01 这样的格局,占用 10 个字符,所以 max_length=10;对国家名称来说个别不超过 50 个字符,所以它的 max_length=50。其余几个字段都是统计数字,用整型即可。

有了数据模型只是第一步,咱们要怎么获取数据呢?这时候就须要将模型与数据库中的表关联起来。

首先,将 ncov 利用注册到 duma 我的项目里,在“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

该命令会在“ncov/migration”目录下创立 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 编写 web 页面

最初一节,咱们来编写 web 页面展示数据。有了下面的根底咱们晓得,应该在 views.py 文件中查问 ncov_cystat 表的数据,而后将数据返回给浏览器。首先须要向 ncov_cystat 表中导入一些数据。

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”文件中的 index 函数 \

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”。

在 ncov 目录里创立“templates/ncov/index.html”文件,编写以下代码

<h3> 国内疫情数据 </h3>

<table border="1">
    <tr>
        <td> 日期 </td>
        <td> 现有确诊 </td>
        <td> 新增确诊 </td>
    </tr>
    {% for stat in cy_stats %}
    <tr>
        <td> {{stat.stat_dt}} </td>
        <td> {{stat.today_confirm}} </td>
        <td> {{stat.today_new_confirm}} </td>
    </tr>
    {% endfor %}
</table>

该文件中应用表格来展现数据,你会发现这并不是一个纯 HTML 文件。精确来说 index.html 是 Django 定义的一种模板语言,它反对依照肯定的语法写 Python 代码,比如说外面的 for 循环、stat 对象的应用。render 函数能够执行解析模板语言,生成纯 HTML 文件,返回给浏览器。

在浏览器拜访 http://127.0.0.1:8000/ncov/,能够看到如下页面

尽管数据能展现进去了,但有些丑,须要优化下前端款式。

刚刚说的 HTML 和 Django 模板语言都是标记语言,语法都比较简单,之前没学过的敌人能够找些教程简略补一下。要展现比拟丑陋的图片,个别要借助 js 实现,有 js 的根底的敌人能够本人写前端页面。如果没有能够用 pyecharts,它反对用 Python 代码制作图表。

下载 pyecharts GitHub 我的项目(https://github.com/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(title="国内疫情数据"))
    )
    return HttpResponse(c.render_embed())

页面成果如下

这样的成果才像点样。

学到这里,咱们曾经入门 Django 了,留个作业,看看你是否做出上面的成果。

全副代码(包含作业)回复“django 入门”获取。明天介绍的只是 Django 一小部分内容,如果大家反馈较好前面会持续更新,有问题也能够随时发问。

以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python 编程学习圈 ,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。

正文完
 0