<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Django入門教程(做個(gè)疫情數(shù)據(jù)報(bào)告)

          共 8669字,需瀏覽 18分鐘

           ·

          2021-11-20 23:25


          Django 是 Python?web框架,發(fā)音?[?d???ɡo]?,翻譯成中文叫“姜狗”。
          為什么要學(xué)框架?其實(shí)我們自己完全可以用 Python 代碼從0到1寫一個(gè)web網(wǎng)站,但那樣就要寫網(wǎng)絡(luò)服務(wù)、數(shù)據(jù)庫讀寫等底層代碼。而框架的作用是把這些底層基建已經(jīng)搭建好了,我們只寫業(yè)務(wù)邏輯即可。
          舉個(gè)例子,樓房就是框架,我們不關(guān)心底層的腳手架、鋼筋水泥是如何搭建的,只要有了這樣的框架我們就可以住進(jìn)去,而里面的房間要怎么設(shè)計(jì)、裝飾才是我們關(guān)心的。

          1

          ?初識(shí)Django


          我使用的 Python 版本是 3.8,先執(zhí)行下面語句先安裝 Django?


          pip install?Django


          安裝完成后,執(zhí)行下面語句創(chuàng)建 Django 項(xiàng)目


          django-admin startproject duma


          項(xiàng)目的名稱可以自定義,我創(chuàng)建的項(xiàng)目名是 duma。


          命令執(zhí)行完畢后,在當(dāng)前目錄會(huì)生成 duma 目錄,該目錄包含以下源文件。


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


          簡(jiǎn)單介紹下這幾個(gè)文件的作用:


          • manage.py: 管理 Django 項(xiàng)目的命令行工具,就像一個(gè)工具箱,后面會(huì)經(jīng)常用到

          • mysite/settings.py:Django 項(xiàng)目的配置文件,如:配置該項(xiàng)目使用什么數(shù)據(jù)庫、包含哪些應(yīng)用等

          • mysite/urls.py:Django 項(xiàng)目的 URL 聲明

          • mysite/asgi.py:作為你的項(xiàng)目的運(yùn)行在 ASGI 兼容的 Web 服務(wù)器上的入口。暫時(shí)用不到

          • mysite/wsgi.py:作為你的項(xiàng)目的運(yùn)行在 WSGI 兼容的Web服務(wù)器上的入口。暫時(shí)用不到


          后面的學(xué)習(xí)中,我們會(huì)使用、修改這上面的文件,那時(shí)候?qū)λ麄兊淖饔脮?huì)有更深的體會(huì)。


          運(yùn)行下面命令,啟動(dòng)web服務(wù),驗(yàn)證 duma 項(xiàng)目是否創(chuàng)建成功。


          python?manage.py?runserver


          執(zhí)行命令,會(huì)看到有以下信息輸出


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


          在瀏覽器訪問?http://127.0.0.1:8000/?



          看到上面的頁面,說明項(xiàng)目創(chuàng)建成功。



          接下來我們要在 duma 項(xiàng)目中創(chuàng)建一個(gè)應(yīng)用(app)。一個(gè)項(xiàng)目里可以有多個(gè)應(yīng)用,如電商項(xiàng)目里可以有商城應(yīng)用、支付應(yīng)用和會(huì)員應(yīng)用等等。


          執(zhí)行這行命令,創(chuàng)建一個(gè)應(yīng)用


          python?manage.py?startapp ncov


          這里創(chuàng)建了一個(gè)名為 ncov 的應(yīng)用,用它來做一個(gè)疫情數(shù)據(jù)報(bào)告。項(xiàng)目根目錄會(huì)發(fā)現(xiàn)有個(gè) ncov 目錄,包含以下文件


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


          先不介紹它們的作用,這些文件后面基本都會(huì)用到,到時(shí)候會(huì)詳細(xì)介紹。



          2

          ?Hello, World


          “Hello, World” 是學(xué)習(xí)任何編程語言的演示程序,現(xiàn)在我們用 Django 實(shí)現(xiàn)一個(gè)“Hello, World” web應(yīng)用。
          首先,在 “nocv/views.py” 文件中創(chuàng)建 index 函數(shù)
          from?django.http import?HttpResponse


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


          然后,在 ncov 目錄中創(chuàng)建 urls.py 文件,它用來定義 ncov 應(yīng)用包含的 url。如:在電商商城應(yīng)用中,會(huì)有商城首頁 url 和商品詳情的 url。
          在 urls.py 文件中添加一個(gè)url,使之與 index 函數(shù)對(duì)應(yīng)起來。
          from?django.urls import?path

          from?. import?views

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


          第一個(gè)參數(shù)是 url 的路徑,這里是空字符串代表 ncov 應(yīng)用的根路徑;第二個(gè)參數(shù)是該 url 對(duì)應(yīng)的視圖;第三個(gè)參數(shù)是該 url 的名稱,可自定義。
          最后,在 “duma/urls.py” 添加代碼,將 ncov 應(yīng)用的 url 注冊(cè)到 duma 項(xiàng)目中,添加后的代碼如下
          from?django.contrib import?admin
          from?django.urls import?path, include

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

          ]


          在瀏覽器訪問 ncov 應(yīng)用根路徑 http://127.0.0.1:8000/ncov/?


          如果看到如上圖的頁面就代表成功了。如果啟動(dòng)的服務(wù)關(guān)閉了,需要在 duma 目錄執(zhí)行 python manager.py runserver 命令重新啟動(dòng)web服務(wù)。
          當(dāng)訪問 ncov 應(yīng)用根路徑的時(shí)候,瀏覽器會(huì)產(chǎn)生一個(gè) http 請(qǐng)求,duma項(xiàng)目的web服務(wù)接到該請(qǐng)求后,根據(jù) urls.py 中的配置,調(diào)用 “ncov/views.py” 文件的 index 函數(shù)來處理該請(qǐng)求,index 函數(shù)中用?HttpResponse 將字符串 “Hello, World” 構(gòu)造為一個(gè) http 響應(yīng)結(jié)果并返回給瀏覽器,瀏覽器接到該響應(yīng)結(jié)果后,在頁面上顯示 “Hello, World” 字符串。
          細(xì)心的話,你會(huì)發(fā)現(xiàn)?HttpResponse('Hello, World!')?跟 print('Hello, World') 很像,后者是我們學(xué)習(xí) Python 語言時(shí)第一個(gè)演示程序。它倆都是輸出 “Hello, World”?字符串,前者輸出在瀏覽器上,后者輸出在控制臺(tái)(命令行)上。
          這就是框架的威力,我們只關(guān)注業(yè)務(wù)邏輯,底層的 http 如何請(qǐng)求、如何響應(yīng)以及如何返回給瀏覽器都是框架幫我們做好了。

          3

          ?連接數(shù)據(jù)庫


          一個(gè)電商網(wǎng)站會(huì)展現(xiàn)很多商品,這些商品信息都存儲(chǔ)在數(shù)據(jù)庫中。同樣的,ncov應(yīng)用也需要把疫情統(tǒng)計(jì)數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫中。
          打開 “duma/settings.py” 文件,找到?DATABASES配置,如下
          DATABASES = {
          ????'default': {
          ????????'ENGINE': 'django.db.backends.sqlite3',
          ????????'NAME': BASE_DIR / 'db.sqlite3',
          ????}
          }


          這里有一些默認(rèn)的配置。
          “default.ENGINE代表數(shù)據(jù)庫引擎是 sqlite3,是一個(gè)輕量數(shù)據(jù)庫。你也可以將數(shù)據(jù)庫引擎改成 MySQL、MongoDB等。
          “default.NAME是數(shù)據(jù)庫名稱,對(duì)于sqlite數(shù)據(jù)來說這里填數(shù)據(jù)庫的路徑, BASE_DIR 代表項(xiàng)目根目錄,此時(shí)再看下項(xiàng)目根目錄可以發(fā)現(xiàn)有?db.sqlite3文件,它是 Django 創(chuàng)建的,后面我們就用它來存儲(chǔ)數(shù)據(jù)。
          不知道你會(huì)不會(huì)有這樣的疑問,說好的數(shù)據(jù)庫,怎么是個(gè)文件?實(shí)際上數(shù)據(jù)庫的底層就是文件,只不過是在文件之上建立了一套引擎可以將文件中的內(nèi)容以表格展示,并提供增加、刪除、修改、查找的功能。就好比程序員的本質(zhì)也是人,只不過從事編程工作所以被稱為程序員。
          有了數(shù)據(jù)庫,還需要在數(shù)據(jù)庫里創(chuàng)建表。一般來說,可以用數(shù)據(jù)庫命令直接建表。但由于我們用的是框架,所以就可以用 Django 來操作。
          在 “ncov/models.py” 文件中創(chuàng)建一個(gè) 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() # 累計(jì)確診
          ????dead = models.IntegerField() # 累計(jì)死亡
          ????heal = models.IntegerField() # 累計(jì)治愈
          ????today_confirm = models.IntegerField() # 現(xiàn)有確診
          ????today_new_confirm = models.IntegerField() # 新增確診


          這里定義 CyStat 類用來表示每個(gè)國家每天的疫情統(tǒng)計(jì)數(shù)據(jù)。包括 7 個(gè)屬性,用?models 中的類對(duì)象來初始化。
          stat_dt 和 cy_name?定義為?models.CharField類型,代表字符類型。日期是 2021-11-01 這樣的格式,占用10個(gè)字符,所以 max_length=10;對(duì)國家名稱來說一般不超過 50 個(gè)字符,所以它的 max_length=50。
          其他幾個(gè)字段都是統(tǒng)計(jì)數(shù)字,用整型即可。
          有了數(shù)據(jù)模型只是第一步,我們要怎么獲取數(shù)據(jù)呢?這時(shí)候就需要將模型與數(shù)據(jù)庫中的表關(guān)聯(lián)起來。
          首先,將 ncov 應(yīng)用注冊(cè)到 duma 項(xiàng)目里,在 “duma/settings.py”?文件中找到?INSTALLED_APPS?配置,并在數(shù)組中添加 ncov 應(yīng)用,添加后?INSTALLED_APPS 數(shù)組如下
          INSTALLED_APPS?= [
          ????'django.contrib.admin',
          ????'django.contrib.auth',
          ????'django.contrib.contenttypes',
          ????'django.contrib.sessions',
          ????'django.contrib.messages',
          ????'django.contrib.staticfiles',
          ????'ncov.apps.NcovConfig'??# 注冊(cè) ncov 應(yīng)用
          ]
          接著,運(yùn)行下面命令
          python?manage.py?makemigrations ncov


          執(zhí)行后,可以看到輸出以下信息

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

          該命令會(huì)在?“ncov/migration” 目錄下創(chuàng)建?0001_initial.py 文件,如果看源代碼可能看不出它的功能,我們可以執(zhí)行下面語句將其轉(zhuǎn)成 sql 就容易理解了。
          python?manage.py?sqlmigrate ncov 0001


          執(zhí)行后,輸出
          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;


          可以發(fā)現(xiàn)實(shí)際上就是一條建表sql,表名是應(yīng)用名和模型類名的組合,用下劃線連接。除了 id 自動(dòng)添加外,其他字段名稱和定義與模型類屬性一致。
          最后,執(zhí)行下面命令來完成建表操作
          python?manage.py?migrate


          我們可以打開 db.sqlite3 數(shù)據(jù)庫來查看是否成功。Mac電腦自帶 sqlite3 命令直接打開,Windows 電腦可以安裝?SQLite Administrator客戶端。
          在項(xiàng)目根目錄執(zhí)行,打開數(shù)據(jù)庫文件
          sqlite3?db.sqlite3


          執(zhí)行 .tables 查看數(shù)據(jù)庫中的表
          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

          可以發(fā)現(xiàn)名為?ncov_cystat 的表,它就是按照 CyStat 類創(chuàng)建的表。除此之外還有很多其他表,它們是 Django 框架自帶的,我們可以先忽略。
          這樣我們將模型 CyStat 類與數(shù)據(jù)庫中的 ncov_cystat 表對(duì)應(yīng)的,后續(xù)我們需要查詢或者修改數(shù)據(jù)直接操作 CyStat 類就可以了,而不用寫 sql。
          這里我們又可以發(fā)現(xiàn)使用 Django 框架的一個(gè)優(yōu)勢(shì) —— 將模型類與數(shù)據(jù)庫隔離(行話叫解耦)。帶來的好處是,如果未來我們的項(xiàng)目上線后想把 sqlite 數(shù)據(jù)庫換成 MySQL,我們只需要在 settings.py 文件中修改?DATABASES 的數(shù)據(jù)庫引擎和數(shù)據(jù)庫名稱,重新執(zhí)行建表命令即可。表的定義以及對(duì)表的查詢、更新邏輯完全不用改。

          4

          ?編寫web頁面


          最后一節(jié),我們來編寫web頁面展現(xiàn)數(shù)據(jù)。有了上面的基礎(chǔ)我們知道,應(yīng)該在 views.py 文件中查詢 ncov_cystat 表的數(shù)據(jù),然后將數(shù)據(jù)返回給瀏覽器。
          首先需要向 ncov_cystat 表中導(dǎo)入一些數(shù)據(jù),可以參考之前的文章《用Python繪制全球疫情變化地圖》自己抓取。
          我也準(zhǔn)備了一部分?jǐn)?shù)據(jù)放在 “ncov/sql/插入疫情數(shù)據(jù).sql” 源碼包里,復(fù)制 1 ~ 60 行 sql 在 sqlite 客戶端執(zhí)行即可。
          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);
          ...


          讀取數(shù)據(jù),返回給瀏覽器。修改?“ncov/views.py” 文件中的 index 函數(shù)
          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 會(huì)返回 ncov_cystat 表里所有記錄,filter 用來按照字段過濾表中的數(shù)據(jù),'cn'代表中國,cy_name='cn'?表示我們只保留國內(nèi)數(shù)據(jù),order_by 用來按照某字段(列)對(duì)返回的結(jié)果排序,字段名前加?‘-’ 代表降序,這里我們只取最近 7 天的數(shù)據(jù)。
          現(xiàn)在我們不能像?“Hello, World” 那樣直接返回,因?yàn)槟欠N方式返回的是一個(gè)字符串,沒有任何樣式。我們返回的應(yīng)該是一個(gè) HTML 文件,所以需要調(diào)用 reder 函數(shù),返回?“ncov/index.html”。
          在 ncov 目錄里創(chuàng)建?“templates/ncov/index.html” 文件,編寫以下代碼
          <h3>國內(nèi)疫情數(shù)據(jù)h3>

          <table?border="1">
          ????<tr>
          ????????<td>日期td>
          ????????<td>現(xiàn)有確診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>


          該文件中使用表格來展示數(shù)據(jù),你會(huì)發(fā)現(xiàn)這并不是一個(gè)純 HTML 文件。準(zhǔn)確來說index.html 是Django?定義的一種模板語言,它支持按照一定的語法寫 Python 代碼,比如說里面的 for 循環(huán)、stat對(duì)象的使用。
          render 函數(shù)可以執(zhí)行解析模板語言,生成純 HTML 文件,返回給瀏覽器。
          在瀏覽器訪問?http://127.0.0.1:8000/ncov/ ,可以看到如下頁面


          雖然數(shù)據(jù)能展示出來了,但有些丑,需要優(yōu)化下前端樣式。

          剛剛說的 HTML 和 Django 模板語言都是標(biāo)記語言,語法都比較簡(jiǎn)單,之前沒學(xué)過的朋友可以找些教程簡(jiǎn)單補(bǔ)一下。
          要展示比較漂亮的圖片,一般要借助 js 實(shí)現(xiàn),有 js 的基礎(chǔ)的朋友可以自己寫前端頁面。如果沒有可以用 pyecharts ,它支持用 Python 代碼制作圖表。
          下載?pyecharts GitHub 項(xiàng)目(https://github.com/pyecharts/pyecharts)源碼,將 “pyecharts/render/templates” 目錄中的源文件復(fù)制到 “ncov/templates” 目錄中,結(jié)果如下


          繼續(xù)修改 index 函數(shù),改為使用 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("現(xiàn)有確診", today_confirm_list)
          ????????.add_yaxis("新增確診", today_new_confirm_list)
          ????????.set_global_opts(title_opts=opts.TitleOpts(title="國內(nèi)疫情數(shù)據(jù)"))
          ????)
          ????return?HttpResponse(c.render_embed())


          頁面效果如下


          這樣的效果才像點(diǎn)樣。

          學(xué)到這里,我們已經(jīng)入門 Django 了,留個(gè)作業(yè),看看你能否做出下面的效果。


          全部代碼(包括作業(yè))回復(fù)?“DJ作業(yè)” 獲取。今天介紹的只是 Django 一小部分內(nèi)容,如果大家反饋較好后面會(huì)繼續(xù)更新,有問題也可以隨時(shí)提問。
          往期推薦

          1、別再問我exe反編譯成Python腳本了!

          2、再見Tkinter,這款GUI神器值得擁有!

          3、爆強(qiáng)!直接把 Python 編寫的圖形程序打包為安卓 APP

          4、為什么阿里巴巴/騰訊不去開發(fā)被卡脖子的工業(yè)軟件?

          5、Windows重要功能被閹割,全球用戶怒噴數(shù)月后微軟終于悔改



          點(diǎn)擊關(guān)注公眾號(hào),閱讀更多精彩內(nèi)容
          瀏覽 34
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费毛片看片 | 国产黄片日逼视频 | 日韩天天操 | 中文字幕第一页二页 | 91偷拍无码 |