Django的簡單使用

2022-11-11 15:03:27

Django 基礎簡介

基礎簡介

1. 軟體框架

一個公司是由公司中的各部部門來組成的,每一個部門擁有特定的職能,部門與部門之間通過相互的配合來完成讓公司運轉起來。

一個軟體框架是由其中各個軟體模組組成的,每一個模組都有特定的功能,模組與模組之間通過相互配合來完成軟體的開發。

軟體框架是針對某一類軟體設計問題而產生的。

2. MVC框架

2.1 MVC簡介

MVC最初是由施樂公司旗下的帕羅奧多研究中心中的一位研究人員給 smalltalk語言發明的一中軟體設計模式。

MVC的產生理念: 分工。讓專門的人去做專門的事。

MVC的核心思想: 解耦

MVC的思想被應用在的web開發的方面,產生了web MVC框架

2.2 Web MVC框架模組功能

通過瀏覽器註冊使用者資訊。

M:Model,模型, 和資料庫進行互動。

V:View,檢視, 產生html頁面。

C:Controller,控制器, 接收請求,進行處理,與M和V進行互動,返回應答。

3. Django框架

3.1 簡介

Django是勞倫斯出版集團的開發人員為開發新聞內容網站而設計出來的一個軟體,它遵循MVC思想,但是有自己的一個名詞,叫做MVT

Django遵循快速開發和DRY原則。Do not repeat yourself.不要自己去重複一些工作。

3.2 MVT各部分功能

M:Model,模型, 和MVC中M功能相同,和資料庫進行互動。

V:View,檢視, 和MVC中C功能相同,接收請求,進行處理,與M和T進行互動,返回應答。

T:Template,模板, 和MVC中V功能相同,產生html頁面。

4. 虛擬環境

4.1 概念

之前安裝python包的命令: sudo pip3 install 包名

包的安裝路徑:/usr/local/lib/python3.5/dist-packages

在同一個python環境中安裝同一個包的不同版本,後安裝的包會把原來安裝的包覆蓋掉。這樣,如果同一臺機器上兩個專案依賴於相同包的不同版本,則會導致一些專案執行失敗。

解決的方案就是:虛擬環境。

虛擬環境是真實python環境的複製版本。

在虛擬環境中使用的python是複製的python,安裝python包也是安裝在複製的python中。

4.2 安裝和設定

安裝虛擬環境的命令:

1)sudo pip install virtualenv -i [https://pypi.tuna.tsinghua.edu.cn/simple/](https://pypi.tuna.tsinghua.edu.cn/simple/) #安裝虛擬環境

2)sudo pip install virtualenvwrapper -i [https://pypi.tuna.tsinghua.edu.cn/simple/](https://pypi.tuna.tsinghua.edu.cn/simple/) #安裝虛擬環境擴充套件包

3)編輯家目錄下面的.bashrc檔案,新增下面兩行。

export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON='/usr/bin/python3'
# export VIRTUALENVWRAPPER_VIRTUALENV=~/virtualenvs
export VIRTUALENVWRAPPER_VIRTUALENV=~/.local/bin/virtualenv
source /usr/local/bin/virtualenvwrapper.sh

4)使用source .bashrc使其生效一下。

4.3 使用

建立虛擬環境命令:

mkvirtualenv 虛擬環境名

建立python3虛擬環境:

mkvirtualenv -p python3 bj11_py3

進入虛擬環境工作:

workon 虛擬環境名

檢視機器上有多少個虛擬環境:

workon 空格 + 兩個tab鍵

退出虛擬環境:

deactivate

刪除虛擬環境:

rmvirtualenv 虛擬環境名

虛擬環境下安裝包的命令:

pip install 包名

注意:不能使用sudo pip install 包名,這個命令會把包安裝到真實的主機環境上而不是安裝到虛擬環境中。

檢視虛擬環境中安裝了哪些python包:

pip list
pip freeze

安裝django環境:

pip install django==3.2.6

拓展:

apt-get install 軟體

pip install python包名

5. 專案建立

5.1 建立Django專案

命令:

django-admin startproject 專案名

注意:建立應用必須先進入虛擬環境。

專案目錄如下:

5.2 建立Django應用

一個專案由很多個應用組成的,每一個應用完成一個功能模組。

建立應用的命令如下:

python manage.py startapp 應用名

注意:建立應用時需要先進入專案目錄。

應用目錄如下:

5.3 應用註冊

建立應用和專案之間的聯絡,需要對應用進行註冊。

修改settings.py中的INSTALLED_APPS設定項。

5.4 啟動專案

執行開發web伺服器命令:

python manage.py runserver

6. 模型類

6.1 ORM

django中內嵌了ORM框架,ORM框架可以將類和資料表進行對應起來,只需要通過類和物件就可以對資料表進行操作。

在Django中主要是設計類:模型類。

ORM另外一個作用:根據設計的類生成資料庫中的表。

6.2 模型類設計

在應用models.py中設計模型類。

必須繼承與models.Model類。

  1. 設計BookInfo類。
  2. 設計HeroInfo類。

Models.ForeignKey可以建立兩個模型類之間一對多的關係,django在生成表的時候,就會在多端的表中建立一列作為外來鍵,建立兩個表之間一對多的關係。

6.3 模型類生成表

  1. 生成遷移檔案
    命令:python manage.py makemigrations

    遷移檔案是根據模型類生成的。
  2. 行遷移生成表
    命令:python mange.py migrate
    根據遷移檔案生成表。
    生成表名的預設格式:
    應用名_模型類名小寫

6.4 通過模型類運算元據表

進入專案shell的命令:

python manage.py shell

以下為在相互shell終端中演示的例子:

首先匯入模型類:

from booktest.models import BookInfo,HeroInfo

  1. oktest_bookinfo表中插入一條資料。
b = BookInfo() #定義一個BookInfo類的物件
b.btitle ='天龍八部' #定義b物件的屬性並賦值
b.bpub_date = date(1990,10,11)
b.save() #才會將資料儲存進資料庫
  1. booktest_bookinfo表中id為1的資料。
b = BookInfo.objects.get(id=1)
  1. 步的基礎上改變b對應圖書的出版日期。
b.bpub_date = date(1989,10,21)
b.save() #才會更新表格中的資料
  1. 一步,刪除b對應的圖書的資料。
b.delete() #才會刪除
  1. oktest_heroInfo表中插入一條資料。
h = HeroInfo()
h.hname = '郭靖'
h.hgender = False
h.hcomment = '降龍十八掌'
b2 = BookInfo.objects.get(id=2)
h.hbook = b2 #給關係屬性賦值,英雄物件所屬的圖書物件
h.save()
  1. 書表裡面的所有內容。
BookInfo.objects.all()
HeroInfo.objects.all()

6.5 關聯操作

  1. 查詢出id為2的圖書中所有英雄人物的資訊。
b = BookInfo.objects.get(id=2)
b.heroinfo_set.all() #查詢出b圖書中所有英雄人物的資訊

7. 後臺管理

  1. 在地化

語言和時區的在地化。

修改settings.py檔案。

  1. 建立管理員

命令:python manage.py createsuperuser

  1. 註冊模型類

在應用下的admin.py中註冊模型類。

告訴djang框架根據註冊的模型類來生成對應表管理頁面。

b = BookInfo()
str(b) __str__
  1. 自定義管理頁面

自定義模型管理類。模型管理類就是告訴django在生成的管理頁面上顯示哪些內容。

8. 檢視

在Django中,通過瀏覽器去請求一個頁面時,使用檢視函數來處理這個請求的,檢視函數處理之後,要給瀏覽器返回頁面內容。

8.1 檢視函數的使用

  1. 定義檢視函數

檢視函數定義在views.py中。

例:

def index(request):
#進行處理...
        return HttpResponse('hello python')

檢視函數必須有一個引數request,進行處理之後,需要返回一個HttpResponse的類物件,hello python就是返回給瀏覽器顯示的內容。

  1. 進行url設定

url設定的目的是讓建立url和檢視函數的對應關係。url設定項定義在urlpatterns的列表中,每一個設定項都呼叫url函數。

url函數有兩個引數,第一個引數是一個正規表示式,第二個是對應的處理動作。

設定url時,有兩種語法格式:

  • url(正規表示式,檢視函數名)
  • url(正規表示式,include(應用中的urls檔案))

工作中在設定url時,首先在專案的urls.py檔案中新增設定項時,並不寫具體的url和檢視函數之間的對應關係,而是包含具體應用的urls.py檔案,在應用的urls.py檔案中寫url和檢視函數的對應關係。

8.2 url匹配的過程

在專案的urls.py檔案中包含具體應用的urls.py檔案,應用的urls.py檔案中寫url和檢視函數的對應關係。

當用戶輸入如http://127.0.0.1:8000/aindex時,去除域名和最前面的/,剩下aindex,拿aindex字串到專案的urls檔案中進行匹配,設定成功之後,去除匹配的a字元,那剩下的index字串繼續到應用的urls檔案中進行正則匹配,匹配成功之後執行檢視函數index,index檢視函數返回內容hellopython給瀏覽器來顯示。

9. 模板

模板不僅僅是一個html檔案。

9.1 模板檔案的使用

  1. 建立模板資料夾
  2. 設定模板目錄

  1. 使用模板檔案
    • 載入模板檔案
      • 去模板目錄下面獲取html檔案的內容,得到一個模板物件。
    • 定義模板上下文
      • 向模板檔案傳遞資料。
    • 模板渲染
      • 得到一個標準的html內容。

9.2 給模板檔案傳遞資料

10. 案例完成

編碼之前的準備工作:

  1. 設計出存取頁面的url和對應的檢視函數的名字,確定檢視函數的功能。
  2. 設計模板檔案的名字。

以下為案例中的簡單設計過程:

  1. 完成圖書資訊的展示:
  2. 設計url,通過瀏覽器存取 http://127.0.0.1:8000/books 時顯示圖書資訊頁面
  3. 設計url對應的檢視函數show_books。
    查詢出所有圖書的資訊,將這些資訊傳遞給模板檔案。
  4. 編寫模板檔案show_books.html。
    遍歷顯示出每一本圖書的資訊。
  5. 完成點選某本圖書時,顯示出圖書裡所有英雄資訊的頁面。
  6. 設計url,通過存取http://127.0.0.1:8000/books/數位時顯示對應的英雄資訊頁面。
    這裡數位指點選的圖書的id。
  7. 設計對應的檢視函數detail。
    接收圖書的id,根據id查詢出相應的圖書資訊,然後查詢出圖書中的所有英雄資訊。
  8. 編寫模板檔案detail.html。

Django 模型

模型

1. Django ORM

O(objects):類和物件。

R(Relation):關係,關聯式資料庫中的表格。

M(Mapping):對映。

Django ORM框架的功能:

  1. 建立模型類和表之間的對應關係,允許我們通過物件導向的方式來運算元據庫。
  2. 根據設計的模型類生成資料庫中的表格。
  3. 通過方便的設定就可以進行資料庫的切換。

2. Django資料庫設定

2.1 mysql命令回顧

2.2 Django設定使用mysql資料庫

修改settings.py中的DATABASES。


注意:django框架不會自動幫我們生成mysql資料庫,所以我們需要自己去建立。

2.3 切換mysql資料庫之後不能啟動伺服器

需要安裝操作mysql資料庫的包,python2環境和python3環境有以下區別。

  • python2需要安裝mysql-python:

pip install mysql-python

  • python3需要安裝pymysql:

pip install pymysql

python3中安裝好pymysql,需要在test2/init.py中加如下內容:

3. 複習案例

頁面重定向:伺服器不返回頁面,而是告訴瀏覽器再去請求其他的url地址。

  1. 設計模型類並生成表
  2. 設計BookInfo,增加屬性bread和bcomment,另外設定軟刪除標記屬性isDelete。
  3. 設計HeroInfo類,增加軟刪除標記屬性isDelete。
    軟刪除標記:刪除資料時不做真正的刪除,而是把標記資料設定為1表示刪除,目的是防止重要的資料丟失。
  4. 編寫檢視函數並設定URL。
  5. 建立模板檔案。
    拆解功能:
  6. 圖書資訊展示頁。
  7. 設計url,通過瀏覽器存取 http://127.0.0.1:8000/index時顯示圖書資訊頁面
  8. 設計url對應的檢視函數index。
    查詢出所有圖書的資訊,將這些資訊傳遞給模板檔案。
  9. 編寫模板檔案index.html。

遍歷顯示出每一本圖書的資訊並增加新建和刪除超連結。

  1. 圖書資訊新增。
    a. 設計url,通過瀏覽器存取 http://127.0.0.1:8000/create時向資料庫中新增一條圖書資訊
    b. 設計url對應得檢視函數create。
  2. 圖書資訊刪除。
    a. 設計url,通過瀏覽器存取 http://127.0.0.1:8000/delete數 字刪除資料庫中對應的一條圖書資料
    其中數位是點選的圖書的id。
    b. 設計url對應的檢視函數delete。 獲取圖書的id,進行刪除。

4. 欄位屬性和選項

4.1 模型類屬性命名限制

  1. 不能是python的保留關鍵字。
  2. 不允許使用連續的下劃線,這是由django的查詢方式決定的。
  3. 定義屬性時需要指定欄位型別,通過欄位型別的引數指定選項,語法如下:

屬性名=models.欄位型別(選項)

4.2 欄位型別

使用時需要引入django.db.models包,欄位型別如下:

4.3 欄位選項

通過選項實現對欄位的約束,選項如下:

對比:null是資料庫範疇的概念,blank是後臺管理頁面表單驗證範疇的。

經驗:

當修改模型類之後,如果新增的選項不影響表的結構,則不需要重新做遷移,商品的選項中default和blank不影響表結構。

參考檔案:

http://python.usyiyi.cn/translate/django_182/index.html

5. 查詢

5.1 mysql的紀錄檔檔案

mysql.log是mysql的紀錄檔檔案,裡面記錄的對MySQL資料庫的操作記錄。預設情況下mysql的紀錄檔檔案沒有產生,需要修改mysql的組態檔,步驟如下:

  1. 使用下面的命令開啟mysql的組態檔,去除68,69行的註釋,然後儲存。

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

  1. 重啟mysql服務,就會產生mysql紀錄檔檔案。

sudo service mysql restart

  1. 開啟MySQL的紀錄檔檔案。

/var/log/mysql/mysql.log 是mysql紀錄檔檔案所在的位置。

使用下面的命令可以實時檢視mysql的紀錄檔檔案:

sudo tail -f /var/log/mysql/mysql.log

5.2 查詢函數

通過模型類.objects屬性可以呼叫如下函數,實現對模型類對應的資料表的查詢。

get範例

例:查詢圖書id為3的圖書資訊。

all方法範例:

例:查詢圖書所有資訊。

filter方法範例:

條件格式:

模型類屬性名__條件名=值

查詢圖書評論量為34的圖書的資訊:

a) 判等 條件名:exact

例:查詢編號為1的圖書。
# Django models 語法
BookInfo.objects.get(id=1)

b) 模糊查詢

例:查詢書名包含’傳’的圖書。contains

BookInfo.objects.filter(btitle__contains='傳')

例:查詢書名以’部’結尾的圖書 endswith 開頭:startswith

BookInfo.objects.filter(btitle__endswith='部')

c)空查詢 isnull

例:查詢書名不為空的圖書。isnull
select * from booktest_bookinfo where btitle is not null;
# Django models 語法
BookInfo.objects.filter(btitle__isnull=False)

d)範圍查詢 in

例:查詢id為1或3或5的圖書。
select * from booktest_bookinfo where id in (1,3,5);
# Django models 語法
BookInfo.objects.filter(id__in = [1,3,5])

e)比較查詢 gt(greate than) lt(less than) gte(equal) 大於等於

lte 小於等於

例:查詢id大於3的圖書。
Select * from booktest_bookinfo where id>3;
# Django models 語法
BookInfo.objects.filter(id__gt=3)

f)日期查詢

# 例:查詢1980年發表的圖書。
BookInfo.objects.filter(bpub_date__year=1980)
# 例:查詢1980年1月1日後發表的圖書。
from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))

exclude方法範例:

# 例:查詢id不為3的圖書資訊。
BookInfo.objects.exclude(id=3)

order_by方法範例:

作用:進行查詢結果進行排序。

# 例:查詢所有圖書的資訊,按照id從小到大進行排序。
BookInfo.objects.all().order_by('id')
# 例:查詢所有圖書的資訊,按照id從大到小進行排序。
BookInfo.objects.all().order_by('-id')
# 例:把id大於3的圖書資訊按閱讀量從大到小排序顯示。
BookInfo.objects.filter(id__gt=3).order_by('-bread')

6. F物件

作用:用於類屬性之間的比較。

使用之前需要先匯入

from django.db.models import F
# 例:查詢圖書閱讀量大於評論量圖書資訊。
BookInfo.objects.filter(bread__gt=F('bcomment'))
# 例:查詢圖書閱讀量大於2倍評論量圖書資訊。
BookInfo.objects.filter(bread__gt=F('bcomment')*2)

7. Q物件

作用:用於查詢時條件之間的邏輯關係。not and or,可以對Q物件進行&|~操作。

使用之前需要先匯入:

from django.db.models import Q
# 例:查詢id大於3且閱讀量大於30的圖書的資訊。
BookInfo.objects.filter(id__gt=3, bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))
# 例:查詢id大於3或者閱讀量大於30的圖書的資訊。
BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))
# 例:查詢id不等於3圖書的資訊。
BookInfo.objects.filter(~Q(id=3))

8. 聚合函數

作用:對查詢結果進行聚合操作。

sum count avg max min

aggregate:呼叫這個函數來使用聚合。 返回值是一個字典

使用前需先匯入聚合類:

from django.db.models import Sum,Count,Max,Min,Avg
# 例:查詢所有圖書的數目。
BookInfo.objects.all().aggregate(Count('id'))

{'id__count': 5}
# 例:查詢所有圖書閱讀量的總和。
BookInfo.objects.aggregate(Sum('bread'))
{'bread__sum': 126}

count函數 返回值是一個數位

作用:統計滿足條件資料的數目。

# 例:統計所有圖書的數目。
BookInfo.objects.all().count()
BookInfo.objects.count()
# 例:統計id大於3的所有圖書的數目。
BookInfo.objects.filter(id__gt=3).count()

小結:

查詢相關函數
get :返回一條且只能有一條資料,返回值是一個物件,引數可以寫查詢條件。

all :返回模型類對應表的所有資料,返回值是 Oueryset 。

filter :返回滿足條件的資料,返回值是 Oueryset ,引數可以寫查詢條件。

exclude :返回不滿足條件的資料,返回值是 Oueryset ,引數可以寫查詢條件。

order _ by :對查詢結果進行排序,返回值是 Queryset ,引數中寫排序的欄位。

注意:

  1. get,filter , exclude 函數中可以寫查詢條件,如果傳多個引數,條件之間代表且的關係。
  2. all,filter , exclude , order _ by 函數的返回值是 Queryset 類的範例物件, 叫做查詢集.

from django.db.models import F,Q,Sum,Count,Avg,Max,Min

F物件:用於類屬性之間的比較。
Q物件:用於條件之間的邏輯關係。

aggregate :進行聚合操作,返回值是一個字典,進行聚合的時候需要先匯入聚合類。
count :返回結果集中資料的數目,返回值是一個數位。

注意:對一個 Oueryset 範例物件,可以繼續呼叫上面的所有函數。

參考檔案:

http://python.usyiyi.cn/translate/django_182/ref/models/querysets.html

9. 查詢集

all, filter, exclude, order_by呼叫這些函數會產生一個查詢集,QuerySet類物件可以繼續呼叫上面的所有函數。

9.1 查詢集特性

  1. 惰性查詢:只有在實際使用查詢集中的資料的時候才會發生對資料庫的真正查詢。
  2. 快取:當使用的是同一個查詢集時,第一次使用的時候會發生實際資料庫的查詢,然後把結果快取起來,之後再使用這個查詢集時,使用的是快取中的結果。

9.2 限制查詢集

可以對一個查詢集進行取下標或者切片操作來限制查詢集的結果。

對一個查詢集進行切片操作會產生一個新的查詢集,下標不允許為負數。

取出查詢集第一條資料的兩種方式:

exists:判斷一個查詢集中是否有資料。True False

10. 模型類關係

  1. 一對多關係

例:圖書類-英雄類

models.ForeignKey() 定義在多的類中。

  1. 多對多關係

例:新聞類-新聞型別類 體育新聞 國際新聞

models.ManyToManyField() 定義在哪個類中都可以。

  1. 一對一關係

例:員工基本資訊類-員工詳細資訊類. 員工工號

models.OneToOneField定義在哪個類中都可以。

11. 關聯查詢(一對多)

11.1 查詢和物件關聯的資料

在一對多關係中,一對應的類我們把它叫做一類,多對應的那個類我們把它叫做多類,我們把多類中定義的建立關聯的類屬性叫做關聯屬性。

# 例:查詢id為1的圖書關聯的英雄的資訊。
b=BookInfo.objects.get(id=1)
b.heroinfo_set.all()

通過模型類查詢:

HeroInfo.objects.filter(hbook__id=1)
# 例:查詢id為1的英雄關聯的圖書資訊。
h = HeroInfo.objects.get(id=1)
h.hbook

通過模型類查詢:

BookInfo.objects.filter(heroinfo__id=1)

格式:

由一類的物件查詢多類的時候:

一類的物件.多類名小寫_set.all() #查詢所用資料

由多類的物件查詢一類的時候:

多類的物件.關聯屬性 #查詢多類的物件對應的一類的物件

由多類的物件查詢一類物件的id時候:

多類的物件. 關聯屬性_id

11.2 通過模型類實現關聯查詢

例:查詢圖書資訊,要求圖書關聯的英雄的描述包含’八’。

BookInfo.objects.filter(heroinfo__hcomment__contains='八')

例:查詢圖書資訊,要求圖書中的英雄的id大於3.

BookInfo.objects.filter(heroinfo__id__gt=3)

例:查詢書名為「天龍八部」的所有英雄。

HeroInfo.objects.filter(hbook__btitle='天龍八部')

通過多類的條件查詢一類的資料:

一類名.objects.filter(多類名小寫__多類屬性名__條件名)

通過一類的條件查詢多類的資料:

多類名.objects.filter(關聯屬性__一類屬性名__條件名)

12. 入、更新和刪除

呼叫一個模型類物件的save方法的時候就可以實現對模型類對應資料表的插入和更新。

呼叫一個模型類物件的delete方法的時候就可以實現對模型類對應資料表資料的刪除。

13. 自關聯

自關聯是一種特殊的一對多的關係。

案例:顯示廣州市的上級地區和下級地區。

地區表:id, atitle, aParent_id;

mysql終端中批次執行sql語句:

source areas.sql;

14. 管理器

BookInfo.objects.all()->objects是一個什麼東西呢?

答:objects是Django幫我自動生成的管理器物件,通過這個管理器可以實現對資料的查詢。objects是models.Manger類的一個物件。自定義管理器之後Django不再幫我們生成預設的objects管理器。

14.1 自定義模型管理器類

  1. 自定義一個管理器類,這個類繼承models.Manger類。
  2. 再在具體的模型類裡定義一個自定義管理器類的物件。

14.2 自定義管理器類的應用場景

  1. 改變查詢的結果集。
    比如呼叫BookInfo.books.all()返回的是沒有刪除的圖書的資料。
  2. 新增額外的方法。
    管理器類中定義一個方法幫我們操作模型類對應的資料表。
    使用self.model()就可以建立一個跟自定義管理器對應的模型類物件。
    小結:

15. 元選項

Django預設生成的表名:

應用名小寫_模型類名小寫。

元選項:

需要在模型類中定義一個元類Meta,在裡面定義一個類屬性db_table就可以指定表名。

Django 檢視

檢視

1. 檢視的功能

接收請求,進行處理,與M和T進行互動,返回應答。

返回html內容 HttpResponse,也可能重定向 redirect,還可以返回json資料。

2. 檢視函數使用

2.1 使用

  1. 定義檢視函數
    request引數必須有。是一個HttpRequest型別的物件。引數名可以變化,
    但不要更改。
  2. 設定url
    建立url和檢視函數之間的對應關係。

3. url設定的過程

  1. 在專案的urls檔案中包含具體應用的urls檔案,在具體應用的urls檔案中包含具體url和檢視的對應關係。
  2. url設定項是定義在一個名叫urlpatterns的列表中,其中的每一個元素就是一個設定項,每一個設定項都呼叫url函數。

4. url匹配的過程

url: http://127.0.0.1:8000/aindex?a=1

  1. 去除域名和後面的引數,剩下/aindex,再把前面的/去掉,剩下aindex
  2. 拿aindex先到專案的url.py檔案中進行從上到下的匹配,匹配成功之後執行後面對應的處理動作,就是把匹配成功的部分a字元去除,然後拿剩下的部分index到應用的urls.py檔案中再進行從上到下的匹配。
  3. 如果匹配成功則呼叫相應的檢視產生內容返回給使用者端。如果匹配失敗則產生404錯誤。

4. 錯誤檢視

404:找不到頁面,關閉偵錯模式之後,預設會顯示一個標準的錯誤頁面,如果要顯示自定義的頁面,則需要的templates目錄下面自定義一個404.html檔案。

  1. url沒有設定
  2. url設定錯誤

500: 伺服器端的錯誤。

  1. 檢視出錯

網站開發完成需要關閉偵錯模式,在settings.py檔案中:

DEBUG=False

ALLOWED_HOST=[ ‘*’]

5. 捕獲url引數

進行url匹配時,把所需要的捕獲的部分設定成一個正規表示式組,這樣django框架就會自動把匹配成功後相應組的內容作為引數傳遞給檢視函數。

  1. 位置引數
    位置引數,引數名可以隨意指定
  2. 關鍵字引數:在位置引數的基礎上給正規表示式組命名即可。
    ?P<組名>
    關鍵字引數,檢視中引數名必須和正規表示式組名一致.

6. 普通登入案例

6.1顯示出登入頁面

  1. 設計url,通過瀏覽器存取 http://127.0.0.1:8000/login 時顯示登入頁面
  2. 設計url對應的檢視函數login。
  3. 編寫模板檔案login.html。

6.2 登入校驗功能

  1. 設計url,點選登入頁的登入按鈕發起請求 http://127.0.0.1:8000/login_check時進行登入校驗。
  2. 設計url對應的檢視函數login_check。
    接收表單提交過來的資料。
    進行登入校驗,若使用者名稱密碼正確則跳轉到登入成功頁。若失敗在跳轉到登入頁面。
  3. 登入成功後跳轉到首頁。

7. Ajax

7.1 基本概念

非同步的javascript。在不全部載入某一個頁面部的情況下,對頁面進行局的重新整理,ajax請求都在後臺。

圖片,css檔案,js檔案都是靜態檔案。

  1. 發起ajax請求:jquery發起
  2. 執行相應的檢視函數,返回json內容
  3. 執行相應的回撥函數。通過判斷json內容,進行相應處理。

7.2 Ajax登入案例

  1. 首先分析出請求地址時需要攜帶的引數。
  2. 檢視函數處理完成之後,所返回的json的格式。

顯示出登入頁面

  1. 設計url,通過瀏覽器存取 http://127.0.0.1:8000/login_ajax 時顯示登入頁面
  2. 設計url對應的檢視函數login_ajax。
  3. 編寫模板檔案login_ajax.html。
def login_ajax(request):
        returnrender(request,'booktest/login_ajax.html')
  1. 登入校驗功能
  2. 設計url,點選登入頁的登入按鈕發起請求http://127.0.0.1:8000/login_ajax_check 時進行登入校驗。
  3. 設計url對應的檢視函數login_ajax_check。
    接收post提交過來的資料。
    進行登入校驗,並返回json內容。 JsonRepsone
    Json格式如下:
{‘res’:‘1’} #表示登入成功

{‘res’:‘0’} #表示登入失敗

8. 狀態保持

http協定是無狀態的。下一次去存取一個頁面時並不知道上一次對這個頁面做了什麼。

cookie是由伺服器生成,儲存在瀏覽器端的一小段文字資訊。

cookie的特點:

  1. 以鍵值對方式進行儲存。
  2. 通過瀏覽器存取一個網站時,會將瀏覽器儲存的跟網站相關的所有cookie資訊傳送給該網站的伺服器。request.COOKIES
  3. cookie是基於域名安全的。www.baidu.com
  4. cookie是有過期時間的,如果不指定,預設關閉瀏覽器之後cookie就會過期。

記住使用者名稱案例:

8.2 Session

session儲存在伺服器端。

session的特點:

  1. session是以鍵值對進行儲存的。
  2. session依賴於cookie。唯一的標識碼儲存在sessionid cookie中。
  3. session也是有過期時間,如果不指定,預設兩週就會過期。

記住使用者登入狀態案例。

8.3 cookie和session的應用場景

cookie:記住使用者名稱。安全性要求不高。

session:涉及到安全性要求比較高的資料。銀行卡賬戶,密碼

Django 模板

模板

1. 模板的功能

產生html,控制頁面上展示的內容。模板檔案不僅僅是一個html檔案。

模板檔案包含兩部分內容:

  1. 靜態內容:css,js,html。
  2. 動態內容:用於動態去產生一些網頁內容。通過模板語言來產生。

2. 模板檔案的使用

通常是在檢視函數中使用模板產生html內容返回給使用者端。

  1. 載入模板檔案 loader.get_template
    獲取模板檔案的內容,產生一個模板物件。
  2. 定義模板上下文 RequeseContext
    給模板檔案傳遞資料。
  3. 模板渲染產生html頁面內容 render
    用傳遞的資料替換相應的變數,產生一個替換後的標準的html內容。

3. 模板檔案載入順序

  1. 首先去設定的模板目錄下面去找模板檔案。
  2. 去INSTALLED_APPS下面的每個應用的templates去找模板檔案,前提是應用中必須有templates資料夾。

4. 模板語言

模板語言簡稱為DTL。(Django Template Language)

4.1 模板變數

模板變數名是由數位,字母,下劃線和點組成的,不能以下劃線開頭。

使用模板變數:{{模板變數名}}

模板變數的解析順序:

例如:{{ book.btitle }}

  1. 首先把book當成一個字典,把btitle當成鍵名,進行取值book[‘btitle’]
  2. 把book當成一個物件,把btitle當成屬性,進行取值book.btitle
  3. 把book當成一個物件,把btitle當成物件的方法,進行取值book.btitle
  • 例如:{{book.0}}
    1. 首先把book當成一個字典,把0當成鍵名,進行取值book[0]
    2. 把book當成一個列表,把0當成下標,進行取值book[0]

如果解析失敗,則產生內容時用空字串填充模板變數。

使用模板變數時,.前面的可能是一個字典,可能是一個物件,還可能是一個列表。

4.2 模板標籤

{% 程式碼段 %}
    for迴圈:
    {% for x in 列表 %}
    # 列表不為空時執行
    {% empty %}
    # 列表為空時執行
    {% endfor %}
可以通過{{ forloop.counter }}得到for迴圈遍歷到了第幾次。
{% if 條件 %}

{% elif 條件 %}

{% else %}

{% endif %}

關係比較操作符:> < >= <= == !=

注意:進行比較操作時,比較操作符兩邊必須有空格。

邏輯運算:not and or

4.3 過濾器

過濾器用於對模板變數進行操作。

date:改變日期的顯示格式。

length:求長度。字串,列表.

default:設定模板變數的預設值。

格式:模板變數|過濾器:引數

自定義過濾器。

自定義的過濾器函數,至少有一個引數,最多兩個

參考資料:(模板標籤和內建過濾器)

http://python.usyiyi.cn/documents/django_182/ref/templates/builtins.html

4.4 模板註釋

單行註釋:{# 註釋內容 #}

多行註釋:

{% comment %}
註釋內容
{% endcomment %}

5. 模板繼承

模板繼承也是為了重用html頁面內容。

在父模板裡可以定義塊,使用標籤:

{% block 塊名 %}
塊中間可以寫內容,也可以不寫
{% endblock 塊名%}

子模板去繼承父模板之後,可以重寫父模板中的某一塊的內容。

繼承格式:{% extends 父模板檔案路徑%}

{% block 塊名 %}

{{ block.super}} #獲取父模板中塊的預設內容

重寫的內容

{% endblock 塊名%}

6. html跳脫

編輯商品詳情資訊,資料表中儲存的是html內容。

在模板上下文中的html標記預設是會被跳脫的。

小於號< 轉換為&lt;

大於號> 轉換為&gt;

單引號' 轉換為&#39;

雙引號" 轉換為 &quot;

與符號& 轉換為 &amp;

要關閉模板上下文字串的跳脫:可以使用 {{ 模板變數|safe}}

{% autoescape off %}
模板語言程式碼
{% endautoescape %}

模板寫死中的字串預設不會經過跳脫,如果需要跳脫,那需要手動進行跳脫。

7. csrf攻擊

首先做一個登入頁,讓使用者輸入使用者名稱和密碼進行登入,登入成功之後跳轉的修改密碼頁面。在修改密碼頁面輸入新密碼,點選確認按鈕完成密碼修改。

登入頁需要一個模板檔案login.html.修改密碼頁面也需要一個模板檔案change_pwd.html.

顯示登入頁的檢視login,驗證登入的檢視login_check,顯示發帖頁的檢視change_pwd,處理修改密碼的檢視change_pwd_action.

加功能:

使用者登入之後才可以進行修改密碼操作。

登入裝飾器函數。

案例流程圖:

django防止csrf的方式:

  1. 預設開啟csrf中介軟體。
  2. 表單post提交資料時加上{% csrf_token %}標籤。

防禦原理:

  1. 渲染模板檔案時在頁面生成一個名字叫做csrfmiddlewaretoken的隱藏域。
  2. 伺服器交給瀏覽器儲存一個名字為csrftoken的cookie資訊。
  3. 提交表單時,兩個值都會發給伺服器,伺服器進行比對,如果一樣,則csrf驗證通過,否則失敗。

8. 驗證碼

在使用者註冊、登入頁面,為了防止暴力請求,可以加入驗證碼功能,如果驗證碼錯誤,則不需要繼續處理,可以減輕業務伺服器、資料庫伺服器的壓力。

9. 反向解析

當某一個url設定的地址發生變化時,頁面上使用反向解析生成地址的位置不需要發生變化。

根據url 正規表示式的設定動態的生成url。

在專案urls中包含具體應用的urls檔案時指定namespace;

urlpatterns-[
    url(r'^admin/',include(admin.site.urls)),
    # 包含應用的urls檔案	
    url(r'^',include('booktest.urls'),namespace='booktest'),
]

在應用的urls中設定是指定name;

urlpatterns-[
    url(r'^index1/$',views.index1,name='index1'),
    url(r'^index2/$',views.index2,name='index2'),
]
在模板檔案中使用時,格式如下:
{% url 'namespace名字:name' %} 
例如{% url 'booktest:fan2'%}
帶位置引數:
{% url 'namespace名字:name' 引數 %} 
例如{% url 'booktest:fan2' 1%}
帶關鍵字引數:
{% url 'namespace名字:name' 關鍵字引數 %} 
例如{% url 'booktest:fan2' id=1 %}
在重定向的時候使用反向解析:
from django.core.urlresolvers import reverse
無引數:
reverse('namespace名字:name名字')
如果有位置引數
reverse('namespace名字:name名字', args = 位置引數元組)
如果有關鍵字引數
reverse('namespace名字:name名字', kwargs=字典)

Django 其他技術

其他技術

1. 靜態檔案

1.1 使用

在 網頁使用的css檔案,js檔案和圖片叫做靜態檔案。

  1. 新建靜態資料夾 static。
  2. 設定靜態檔案所在的物理目錄。Settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']
STATIC_ROOT = "/home/zic/桌面/singleBlog/singleBlog/static"

STATIC_URL設定存取靜態檔案對應的url。

STATICFILES_DIRS設定靜態檔案所在的物理目錄。

動態生成靜態檔案的路徑。

1.2 載入目錄

STATICFILES_FINDERS=('django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder')

2. 中介軟體

中介軟體函數是django框架給我們預留的函數介面,讓我們可以干預請求和應答的過程。

2.1 獲取瀏覽器端的ip地址

使用request物件的META屬性:request.META[‘REMOTE_ADDR’]

2.2 使用中介軟體

  1. 新建middleware.py檔案。
  2. 定義中介軟體類。

在類中定義中介軟體預留函數。