1. 程式人生 > >Django + DebugToolbar構建全棧WEB開發

Django + DebugToolbar構建全棧WEB開發

Django是什麼

DjangoPython最流行的WEB開發框架,很多公司都用Django來做專案,內建的ORM模型非常方便和易用,是一個全能的WEB開發框架。

Django有很多優秀的特性:

  • Python3完整支援的框架
  • 支援Sqlite/MySQL/PostgreSQL等資料庫,強大的migrate機制,修改對資料庫欄位變更非常便利,能自動生成變更的SQL語句,並且做規則檢查
  • 靈活的模板引擎,通過內建的FilterTag做模板,模板能繼承,可以方便的組織模板的框架
  • 安全的框架,不論是CSRF,還是XSS或者SQL注入,預設的安全選項等級比較高,給很多初學者很好的安全保護
  • 完整的單元測試支援,能模擬Cookie
    Session等場景做整合測試,極大方便了前後端分離的專案的整合測試
  • Debug功能強大,程式碼儲存後就立即生效, 異常錯誤後的堆疊資訊甚至能看到每個呼叫幀的區域性變數,極大的方便了開發者
  • 非常靈活的擴充套件,所以產生了很多優秀的擴充套件

Django-Debug-Toolbar

基於Django的靈活擴充套件,這次推薦一個非常實用的擴充套件:django-debug-toolbarDjango內建的Debug特性,只有在發生異常後能檢視異常資訊,但是開發過程當中,我們想知道:

  • 資料庫調研時間、次數是多少
  • 模板渲染的時間是多久
  • 靜態檔案訪問情況

通過django-debug-toolbar

極大的提升了開發效率,這個教程教會你如何安裝在Django中使用django-debug-toolbar

在雲伺服器上安裝Django的開發環境

本教程基於Ubuntu 16.04.4 LTSPython3,開始這個教程前,需要到滴滴雲購買一個Ubuntu 16.04.4 LTS的雲伺服器,由於需要提供WEB服務,所以需要買一個帶公網IP的雲伺服器。滴滴雲的映象內建了很多開發工具,比如python3sysstatiotop等常見工具,不需要額外再安裝其他工具,非常順手。

滴滴雲的雲伺服器預設的登入名是dc2-user, 並不是root登入,如果需要root操作的指令,需要通過sudo操作才能進行,這樣確保我們日常的操作不會用root

這個身份來管理伺服器,避免危險的誤操作。 如果你習慣用root管理你的伺服器,強烈建議改掉這個壞習慣,用sudo吧

通過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來安裝djangodjango-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.pyDebug = TrueDebug = 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,分析你的請求攜帶的資訊,幫助你快速分析資料是否提交正確。