Django + DebugToolbar構建全棧WEB開發
Django是什麼
Django是Python
最流行的WEB開發框架,很多公司都用Django
來做專案,內建的ORM模型非常方便和易用,是一個全能的WEB開發框架。
Django有很多優秀的特性:
Python3
完整支援的框架- 支援
Sqlite
/MySQL
/PostgreSQL
等資料庫,強大的migrate
機制,修改對資料庫欄位變更非常便利,能自動生成變更的SQL語句,並且做規則檢查 - 靈活的模板引擎,通過內建的
Filter
與Tag
做模板,模板能繼承,可以方便的組織模板的框架 - 安全的框架,不論是
CSRF
,還是XSS
或者SQL注入
,預設的安全選項等級比較高,給很多初學者很好的安全保護 - 完整的單元測試支援,能模擬
Cookie
Session
等場景做整合測試,極大方便了前後端分離的專案的整合測試 Debug
功能強大,程式碼儲存後就立即生效, 異常錯誤後的堆疊資訊甚至能看到每個呼叫幀的區域性變數,極大的方便了開發者- 非常靈活的擴充套件,所以產生了很多優秀的擴充套件
Django-Debug-Toolbar
基於Django
的靈活擴充套件,這次推薦一個非常實用的擴充套件:django-debug-toolbar
。 Django
內建的Debug
特性,只有在發生異常後能檢視異常資訊,但是開發過程當中,我們想知道:
- 資料庫調研時間、次數是多少
- 模板渲染的時間是多久
- 靜態檔案訪問情況
- …
通過django-debug-toolbar
Django
中使用django-debug-toolbar
。
在雲伺服器上安裝Django的開發環境
本教程基於Ubuntu 16.04.4 LTS
與Python3
,開始這個教程前,需要到滴滴雲購買一個Ubuntu 16.04.4 LTS
的雲伺服器,由於需要提供WEB服務,所以需要買一個帶公網IP的雲伺服器。滴滴雲的映象內建了很多開發工具,比如python3
、sysstat
、iotop
等常見工具,不需要額外再安裝其他工具,非常順手。
滴滴雲的雲伺服器預設的登入名是dc2-user, 並不是root
登入,如果需要root
操作的指令,需要通過sudo
操作才能進行,這樣確保我們日常的操作不會用root
通過dc2-user登入伺服器
儘量選擇用ssh公鑰登入伺服器,避免輸入密碼,並且關閉伺服器的密碼登入,可以極大的提升伺服器的安全性,畢竟ssh公鑰證書的安全等級比密碼安全等級高。
登入後可以看到伺服器的資訊(YOUR_SERVER_IP
可以替換成你的伺服器):
[[email protected]:~] $ ssh [email protected]_SERVER_IP
[email protected]:~$ uname -a
Linux 10-255-20-246 4.4.0-127-generic #153-Ubuntu SMP Sat May 19 10:58:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[email protected]:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"
安裝Django
Python推薦的包管理工具是pip,類似Ubuntu裡面的apt
或者CentOS的YUM
,通過pip
能方便的安裝常見的安裝包。
pip
預設的源是在海外,滴滴雲提供了一個預設的pip
源,避免訪問海外的倉庫,下載速度非常的快。所以我們需要先配置一下pip
源。
mkdir -p ~/.pip && cat > ~/.pip/pip.conf << EOF
[global]
index-url = http://mirrors.intra.didiyun.com/pip/simple/
trusted-host = mirrors.intra.didiyun.com
EOF
Django
預設不支援Python2.x,所以我們需要用pip3
來安裝django
和 django-debug-toolbar
。
[email protected]:~$ sudo apt-get install python3-pip
[email protected]:~$ sudo pip3 install django django-debug-toolbar
建立一個Django的專案
安裝好Django
後,可以通過django-admin
來維護和管理專案。首先,我們建立一個Django
專案 djsite。
建立第一個專案,檢視生成的目錄結構:
[email protected]:~$ django-admin startproject djsite
[email protected]:~$ tree djsite/
djsite/
├── djsite
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
1 directory, 5 files
執行你的第一個Django專案
生成的djite目錄下有manage.py
,通過這個檔案來做專案的常規操作,比如建立超級管理員、啟動伺服器。
預設建立的專案的資料庫引擎是sqlite
,建立後的專案需要初始化資料庫,確保django
內建的資料庫版本管理、session
等特效能正常使用。
通過manange.py migrate
來初始化資料庫:
[email protected]:~/djsite$ python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
...
Applying sessions.0001_initial... OK
[email protected]:~/djsite$
這樣就完成了資料庫的初始化工作。
啟動Web伺服器
通過manange.py runserver
來啟動伺服器,預設伺服器會執行在127.0.0.1:8000
,只能本機訪問。
[email protected]:~/djsite$ python3 manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
November 01, 2018 - 09:11:54
Django version 2.1.2, using settings 'djsite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
你可以通過curl看一下web伺服器是否正常執行:
[email protected]:~$ curl http://127.0.0.1:8000/
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Django: the Web framework for perfectionists with deadlines.</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
...
通過公網訪問你的雲伺服器
如果我們需要公網訪問,那麼就需要讓伺服器執行在非本機的80埠,但是如果執行在80埠,就需要root
許可權,我們通過sudo 就可以了。
[email protected]:~/djsite$ sudo python3 manage.py runserver 0.0.0.0:80
...
Django version 2.1.2, using settings 'djsite.settings'
Starting development server at http://0.0.0.0:80/
Quit the server with CONTROL-C.
通過公網IP就可以直接訪問你的WEB伺服器。
其實這時候如果你直接訪問伺服器的80埠,會遇到提醒(YOUR_HOST_IP
是你的伺服器IP):
DisallowedHost at /
Invalid HTTP_HOST header: 'YOUR_HOST_IP'. You may need to add 'YOUR_HOST_IP' to ALLOWED_HOSTS.
這時候就體現了Django
的預設安全設定很體貼了,避免犯初級錯誤。
因為你當前的伺服器是在Debug
模式,只能通過127.0.0.1
的方式來訪問,如果你要通過公網訪問,有兩張方式:
- 方法一:修改
settings.py
的Debug = True
為Debug = False
,關閉Debug模式 - 方法二:保留
Debug
模式,把你的公網IP加入到ALLOWED_HOSTS
中
ALLOWED_HOSTS = ['YOUR_HOST_IP']
這時候在重新啟動服務就可以正常訪問了。
[email protected]:~/djsite$ sudo python3 manage.py runserver 0.0.0.0:80
Django
專案最大的特點是配置檔案是Python
,所以可以把配置當成程式碼來使用。
引入django-debug-toolbar
要在專案中使用django-debug-toolbar
,最簡單的方式就是修改settings.py
修改INSTALLED_APPS
:
INSTALLED_APPS = [
'django.contrib.admin',
#...
'django.contrib.staticfiles',
#確保staticfiles的順序比debug_toolbar靠前
'debug_toolbar',
]
修改MIDDLEWARE
:
MIDDLEWARE = [
# ...
'debug_toolbar.middleware.DebugToolbarMiddleware',
# ...
]
新增INTERNAL_IPS
選項
通常情況下,django-debug-toolbar
只會對開發者提供展示,如果你是本機開發,只需要允許127.0.0.1
訪問就可以,本次是在伺服器上訪問,你可以全部放開訪問,也可以通過訪問ip.cn
來得到你的出口IP地址,把你的出口IP地址加入到INTERNAL_IPS
中。
[[email protected]:~] $ curl ip.cn
當前 IP: 183.128.190.90 來自: 浙江省杭州市 電信
在這個教程中,把我自己家裡的公網ip183.128.190.90
寫入到INTERNAL_IPS
中。
INTERNAL_IPS = ['183.128.190.90']
django-debug-toolbar
會在每一個html的請求中注入一段js,我們需要修改一下urls.py,確保這些js資源能正常訪問。
# ...
# 需要訪問專案的settings資訊。並且用到了 include指令
#
from django.conf import settings
from django.urls import path, include
urlpatterns = [
''
path('admin/', admin.site.urls),
]
# ...
# 加入這段程式碼到urls.py的尾部
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
path('__debug__/', debug_toolbar.urls),
] + urlpatterns
訪問看看效果
這是可以通過訪問http://YOUR_HOST_IP/admin/
,測試django-debug-toolbar
是否正常工作。 注: 需要注意我的雲伺服器是通過80埠開放服務
如果正常工作後,會在頁面的右上角有個浮動的工具欄,可以看SQL
、快取
、模板
的執行時間,特別是SQL
,你會發現訪問一個頁面,預設會訪問很多資料庫訪問。
也可以通過看Request
,分析你的請求攜帶的資訊,幫助你快速分析資料是否提交正確。