-
Django簡介
-
python下有多款不同的web框架,Django是最有代表行的一種。許多成功的網站和app都基於djanfo。
-
django是一個開源的web應用框架,由python寫成。
-
django采用了MVC的軟件設計模式,即模型M,視圖V和控制器C。
-
Django特點
-
強大的數據庫功能:用python的類繼承,幾行代碼就可以擁有一個動態的數據庫操作API,如果需要也能執行SQL語句。
-
自帶的強大的后台功能:幾行代碼就讓網站擁有一個強大的后台,輕松管理內容。
-
優雅的網址:用正則匹配網址,傳遞到對應函數。
-
模板系統:強大,易擴展的模板系統,設計簡易,代碼和樣式分開設計,更易管理。
-
緩存系統:與memcached或其它緩存系統聯用,表現更出色,加載速度更快。
-
國際化:完全支持多語言應用,允許你定義翻譯的字符,輕松翻譯成不同國家的語言。
-
Django項目目錄
manage.py:用來管理當前項目的一個命令行工具
myproject/: 項目主文件夾
myproject/__init__.py:空文件,用來指明當前的myproject為一個可導入的模塊包
myproject/settings.py:項目主要配置文件
myproject/urls.py:項目主要路由配置文件
myproject/wsgi.py:項目部署WSGI並發服務器時所需要的配置
-
安裝Django
-
pip install django 默認安裝最新版本
-
pip install django==2.0.4 (指定版本號安裝)
- 創建項目
-
django-admin startproject mypro

-
開啟開發服務器
-
cd myproject 進入項目目錄
-
python manage.py runserver 開啟服務
-
python manage.py runserver 7000 改變服務監聽端口
-
python manage.py runserver 0:8000 改變服務監聽IP:端口
-
配置settings.py
-
BASE_DIR : 當前項目工作目錄,用來在每一次開啟項目時動態找到相關資源路徑
-
SECRET_KEY : 加密的hash值以及保護某些簽名數據的關鍵密鑰
-
DEBUG : 調試模式
-
ALLOWED_HOSTS : 有哪些主機或域名可以訪問當前django站點,如設置為*代表全部可訪問。
-
INSTALL_APPS : django項目中所有使用的應用名稱,自創建子應用也要加到這里,不然ORM數據庫無法被識別到!
-
MIDDLEWARE : django中間件,用來在request或reponse過程中添加功能,比如確保安全性,傳輸保存Session等
-
SecurityMiddleware : xss腳本過濾,一些安全設置
-
SessionMiddleware : session支持中間件,在每次用戶訪問django項目時,添加session對每一個瀏覽器
-
CommonMiddleware : 通用組件,比如為路由添加末尾斜杠
-
CsrfViewMiddleware : 防跨站請求偽造令牌,為客戶端添加csrf_token密鑰,在表單提交時需提交該值
-
AuthenticationMiddleware : admin用戶組件,每個request對象都會被添加admin下的user屬性
-
MessageMiddleware : 消息中間件 展示一些后台消息給前端
-
XFrameOptionsMiddleware : 防止欺騙點擊攻擊出現;自身頁面被嵌入到他人頁面中,點擊欺騙
-
ROOT_URLCONF : 主路由配置文件,字符串填寫url.py文件路徑
-
TEMPLATES : 模板文件配置項
-
WSGI_APPLICATION : WSGI服務器配置項,找到當前django下的wsgi引入APP文件
-
DATABASES : 數據庫配置項,默認使用SQLite3,一個本地文件數據庫
-
AUTH_PASSWORD_VALIDATORS : 檢查用戶密碼強度的驗證程序列表,不過是針對admin界面下的用戶,而非自定義
-
LANGUAGE_CODE : django所使用語言文件
-
TIME_ZONE : django所使用時區
-
USE_I18N : 國際化支持 18表示Internationalization這個單詞首字母I和結尾字母N之間的字母有18個
-
USE_L10N : 是localization的縮寫形式,意即在l和n之間有10個字母
-
USE_TZ :開啟了Time Zone功能,則所有的存儲和內部處理,包括print顯示的時間將是是UTC時間格式
-
STATIC_URL : URL訪問靜態資源時的路徑
-
創建子應用
-
項目和應用有啥區別?
-
創建app
-
cd mypro
-
django-admin startapp helloapp

-
頁面和視圖
- 視圖函數
1 # 每一個視圖函數都需要有一個必須參數 request,用來接收用戶訪問時的請求內容 2 from django.http import HttpResponse 3 def index(request): 4 return HttpResponse("<h1>Hello world</h1>
HttpResponse函數用來像用戶返回一個字符串。
- 路由配置
-
- 第一種簡單的路由配置,直接在主控路由文件下,找到這個視圖函數
1 #myproject/urls.py 2 from django.contrib import admin 3 from django.urls import path 4 from myapp import views 5 urlpatterns = [ 6 path('admin/', admin.site.urls), #admin控制界面路由 7 path('',views.index) 8 #path函數第一個參數為訪問地址,空字符串代表:當用戶直接訪問首頁時 9 #第二個參數代表訪問該地址時對應的視圖函數,我們引入了app下的views中的index視圖函數。 10 ]
接下來訪問127.0.0.1:8000,那么你會看到一個非常大的Hello world。
-
- 以上將視圖函數的查找直接寫到主控路由並不是最好的辦法,我們的項目通常會有非常多的路由配置項,如果都堆到這個文件中肯定是非常亂的,難以維護;我們可以在對應app下創建一個子路由控制文件,並在其中設置視圖的路由配置。
1 #myapp/urls.py 2 from django.urls import path 3 from . import views 4 urlpatterns = [ 5 path("",views.index) 6 ]
-
- 現在雖然配置了app下的路由文件,但是訪問時,是看不到對應視圖的結果這是因為默認的url查找動作將會從主控路由文件開始,我們還需要在主控路由文件下進行路由分發設置,讓主控路由可以找到子app下的路由
1 #myproject/urls.py 2 from django.contrib import admin 3 from django.urls import path,include 4 from myapp import views 5 urlpatterns = [ 6 path('admin/',admin.site.urls), 7 #path('',views.index) 8 path('',include("myapp.urls")), 9 # 函數 include() 允許引用其它 URLconfs 10 ]
接下來再次嘗試,在瀏覽器中訪問主機域名;如果可以看到的話,恭喜你,效果已經很棒了!
路由查找流程:
1. 查找主控路由文件下的 urlpatterns 全局變量,這是一個序列數據類型,其中每一個元素都是對應的一個路由匹配規則
2. 如果在規則中查找到符合匹配規則的,則執行其中的對應執行函數
3. 如果對應的不是一個執行函數,而是一個 include 路由包含,那么截斷與此項匹配的 URL 的部分,並將剩余的路由字符串發送到 include所包含的子路由文件中以供進一步處理4. 如果沒有匹配到的任何結果,django默認拋出 Page not found (404)
注意:Django的路由不考慮HTTP請求方式,僅根據URL進行路由,即,只要URL相同,無論POST、GET等哪種請求方式都指向同一個操作函數。
-
path
1 path(route, view, name) 2 #route: 匹配規則,是一個字符串 3 #view:對應的視圖函數 4 #name:未來我們會用到他,用來為匹配規則命名,這樣方便日后修改路由而不影響全局下的路由使用
-
re_path
-
模板頁面
返回一個字符串這肯定是不行的,太low了,也不好看,現在來返回一個正式的HTML頁面。並在HTML頁面中加入模板變量,由視圖函數動態傳遞值;配置django中模板頁面的保存路徑,在項目目錄下的settings.py文件中。
1 #myproject/settings.py 2 TEMPLATES = [ 3 { 4 'BACKEND': 'django.template.backends.django.DjangoTemplates', 5 'DIRS': [os.path.join(BASE_DIR,'template')], # 就是這一行設置靜態模板路徑 6 'APP_DIRS': True, 7 'OPTIONS': { 8 'context_processors': [ 9 'django.template.context_processors.debug', 10 'django.template.context_processors.request', 11 'django.contrib.auth.context_processors.auth', 12 'django.contrib.messages.context_processors.messages' 13 ], 14 }, 15 }, 16 ]
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>hi</title> 6 </head> 7 <body> 8 <h1>{{ message }}</h1> 9 </body> 10 </html>
在HTML頁面中,我們並沒有明確指出H1標簽的內容;通過一個{{ message }}來等待接收視圖函數傳來的數據,在HTML頁面中這樣的變量也叫做模板變量,常用雙大括號語法。
接下來修改之前的視圖函數,由視圖函數傳遞變量給到HTML頁面。
1 #myapp/views.py 2 from django.shortcuts import render 3 def index(request): 4 #return HttpResponse("<h1>Hello world</h1>") 5 content = {"message":"你好,世界" #此處的key值message對應頁面中我們寫的{{ message }} 6 } 7 return render(request,'index.html',content)
-
為什么模板文件夾中還要在創建一個hello子文件夾呢?
-
頁面中使用URL
1 <a href="{% url 'hello' '張三' %}">你好,張三</a>
1 path('hello/<str:name>', views.hello, name='hello')
1 app_name = 'hello' urlpatterns = [ path('', views.index, name='index'), path('hello/<str:name>', views.hello, name='hello') ]
1 <a href="{% url 'hello:hello' '張三' %}">你好,張三</a>
-
靜態文件
雖然有了模板頁面,可以來展示一些標簽的效果,但是整個HTML還是感覺很丑陋,所以,我們還要繼續引入
一些類似css、img這樣的靜態資源,來裝飾我們的頁面。
在django中模板頁面的靜態資源使用,不能像之前寫HTML代碼直接引入,需要我們首先在項目中創建目錄保
存對應的靜態資源。
-
- 在settings中配置靜態文件保存目錄,添加如下內容:
有些靜態文件可能是多個app公用的,這時候需要進行一點額外設置。首先在和app同級的目錄創建static文件夾並將靜態文件放入。然后在配置文件中添加額外的搜索路徑配置。
還是由於django文件搜索機制,我們最好在靜態目錄中添加一個public子文件夾和其他靜態文件區分。
1 STATICFILES_DIRS = ( 2 os.path.join(BASE_DIR, 'static'), 3 ) 4 # STATICFILES_DIRS 該配置項用來告訴django在查找靜態資源時,應該訪問哪個目錄
- 在項目中創建static目錄,static目錄下創建專門保存圖片的img目錄,在里面存一張圖片1.jpg


-
- 有了圖片,接下來在模板頁面中去引入並使用它,打開index.html進行修改:
1 <!DOCTYPE html> 2 <html lang="en"> 3 {% load staticfiles %} 4 <head> 5 <meta charset="UTF-8"> 6 <title>hi</title> 7 </head> 8 <body> 9 <h1>{{ message }}</h1> 10 <img src='{% static "img/1.jpg" %}' alt="圖片"> 11 </body> 12 </html>
-
- 這里用到了一個特殊語法: {% tag %} 這個叫靜態標簽,靜態標簽不同於模板變量,靜態標簽經常用來加載數據,或創建邏輯,比如之后我們要學到的 {% if %} ,使用靜態標簽可以方便我們在模板頁面上實現某些只有在后台代碼中才可以實現的邏輯功能。
- 在頁面中要引入靜態資源,圖片,CSS,JS文件,在引入時都需要通過 {% static "path" %} 來進行引入,並且在模板頁面頭部需要使用 {% load staticfiles %} 標簽進行靜態資源的加載。
- 模型數據庫
-
創建數據庫,這里使用項目自帶的SQLite3數據庫,默認已經是配好的,接下來需要我們進入到app下的models.py文件中,編寫一個類,這個類就對應數據庫中的一張表。
1 #myapp/models.py 2 from django.db import models 3 # Create your models here. 4 class Weather(models.Model): 5 weather = models.CharField(max_length=100,verbose_name="天氣") 6 class Meta:verbose_name_plural = "天氣" 7 # 設置當前表名的一個可讀的性更好的名字 8 def __str__(self): 9 return self.weather
-
- 在這里我們使用到了django的orm映射關系用來創建數據庫表,繼承自django的models.Model類,一個類用來表示一張表,類中的一個屬性代表一個字段,這里我們定義了一個類型為CharField,長度為100的字段,用來存儲天氣。
-
- 下面的class Meta是模型類的元類,用來設置當前表的一些屬性;這里我們使用verbose_name_plural屬性設置當前表在admin后台查看時的名字
-
- 在這里我們還定義了一個屬於實例的函數__str__,用來描述當前數據在返回時的默認展示結果,為weather字段的值
-
- django在創建模型類對應的數據表時,默認使用 應用名 加 下划線 加 模型類名 作為表的名字;比如當前Weather表名為:myapp_Weather
-
orm映射關系,是django與數據庫之間的一個橋梁,可以使開發者不再關注如何去編寫SQL語句,直接通過一套ORM所提供的API接口即可方便對各種數據庫進行交互。
-
當某個子應用APP涉及到了數據庫的使用時,要記得在settings文件中進行配置:
1 #myproject/settings.py 2 INSTALLED_APPS = [ 3 'django.contrib.admin', 4 'django.contrib.auth', 5 'django.contrib.contenttypes', 6 'django.contrib.sessions', 7 'django.contrib.messages', 8 'django.contrib.staticfiles', 9 'myapp', 10 ]
-
接下來通過manage.py命令行管理工具提供的兩條,創建我們所需要的數據。
-
- 注意:默認django本身就已經需要一些數據的創建,所以我們在初次執行以下兩條命令時可能會看到很多數據表和字段的創建,不要驚訝,這是正常的
1 python manage.py migrate # 根據數據庫遷移文件生成對應SQL語句並執行 2 # 初次執行是為了先把默認django需要的數據庫創建出來 3 python manage.py makemigrations # 創建數據庫遷移文件 4 # 這次執行是為了創建APP中Weather模型類的遷移文件 5 python manage.py # 將新添加的模型類遷移文件生成對應SQL並執行,實際創建出對應的Weathe表
-
Django Admin
-
- admin控制台是django為我們提供的一個非常便捷的用來管理數據庫的界面。在主控路由文件下,其實你已經看到了它對應的路由設置:path('admin/', admin.site.urls),
-
進入admin界面,初次訪問連接:127.0.0.1/admin,會提示我們輸入賬號密碼,這是因為django的admin界面是需要一個超級管理員來登陸訪問的,所以還需要我們創建對應的admin界面下的超級用戶
-
創建admin超級用戶,使用manage.py命令行執行如下命令:
python manage.py createsuperuser
Username (leave blank to use 'lienze'): root Email address: Password:Password (again): This password is too short. It must contain at least 8 characters. This password is too common. This password is entirely numeric. Password: Password (again): This password is too common. This password is entirely numeric. Password: Password (again): Superuser created successfully.
- 以上是我們創建超級用戶的過程,非常坎坷;可以看到,在輸入太短(不滿足8位),或是只包含數字的簡單密碼,超級用戶的創建都是被拒絕的所以我們把用戶賬號創建為 root ,而密碼創建為 a1234567 ,接下來開啟測試服務器,並通過創建好的超級用戶登陸訪問,如果幸運的話,你已經可以看到后台的admin界面啦admin界面已經展示出了默認django所使用的兩張表,用戶表和組表,用來保存當前管理后台的用戶以及對應權限分組,可以點入用戶表查看其中我們剛創建的root。
$ python manage.py runserver



-
admin注冊表
-
在app下的admin.py文件中進行模型類的注冊:
1 #myapp/admin.py 2 from django.contrib import admin 3 from myapp import models 4 admin.site.register(models.Weather) 5 #使用register函數接收模型類作為參數即可完成
-
例:

-
這個表單是從問題 Question 模型中自動生成的
-
不同的字段類型(日期時間字段 DateTimeField 、字符字段 CharField)會生成對應的 HTML 輸入控件。每個類型的字段都知道它們該如何在管理頁面里顯示自己。
-
每個日期時間字段 DateTimeField 都有 JavaScript 寫的快捷按鈕。日期有轉到今天(Today)的快捷按鈕和一個彈出式日歷界面。時間有設為現在(Now)的快捷按鈕和一個列出常用時間的方便的彈出式列表。
-
保存(Save) - 保存改變,然后返回對象列表。
-
保存並繼續編輯(Save and continue editing) - 保存改變,然后重新載入當前對象的修改界面。
-
保存並新增(Save and add another) - 保存改變,然后添加一個新的空對象並載入修改界面。
-
刪除(Delete) - 顯示一個確認刪除頁面。

-
視圖操作模型
1 #myapp/views.py 2 from django.shortcuts import render 3 from myapp import models 4 def index(request): 5 weathers = models.Weather.objects.all() 6 content = { 7 "weathers":weathers, 8 } 9 return render(request, 'index.html', content)
1 <!DOCTYPE html> 2 <html lang="en"> 3 {% load staticfiles %} 4 <head> 5 <meta charset="UTF-8"> 6 <title>hi</title> 7 </head> 8 <body> 9 {% for weather in weathers %} 10 <p>{{ weather }}</p> 11 {% empty %} 12 <p>沒有任何天氣</p> 13 {% endfor %} 14 </body> 15 </html>