Django框架

Web框架之Django:

請給做者點贊 —> 原文連接

(1)簡介:

  
  
  
  

(2)Django的處理流程:

blob.png

  • 當用戶發出HTTP請求,URLhandler接收用戶請求,根據開發人員設置的路由規則匹配相應的處理類 根據請求的類型判斷調用的HTTP方法
  • 若是須要鏈接數據庫,Views中的函數將會調用Models的方法,不然直接去Template中取出HTML頁面直接返回
  • 調用Models的時候,Models會去數據庫讀取數據再返回給Views
  • 通過渲染頁面一塊兒將最終的HTML頁面返回給頁面

☆MTV與MVC:

MTV和MVC的思想是同樣的的,只是思想的體現有所不一樣。javascript

MVC:M管理應用程序的狀態,並約束改變狀態的行爲,通常叫作業務規則;V負責把數據格式化後呈現給用戶查看;C接收用戶操做,根據訪問模型獲取數據,並調用視圖顯示這些數據,控制器(處理器)用於將模型與視圖隔離併成爲兩者之間的聯繫紐帶。html

MTV:M表明數據存取層,也就是Model,改爲處理與數據相關的全部事務如何存取,如何驗證數據的有效性,包含哪些行爲與數據相關;T指的是表現層,該層處理與現實相關的行爲,如何在頁面文檔中顯示數據,展示內容,也就是Template;V表明業務邏輯層,該層包含存取模型及調取恰當模板的相關邏輯。java

☆Django版的MTV:

Django也是一個MVC框架。可是在Django中,控制器接受用戶輸入的部分由框架自行處理,因此 Django 裏更關注的是模型(Model)、模板(Template)和視圖(Views),稱爲 MTV模式。node

☆Django設計MVC優美哲學:

1.對象關係映射 (ORM,object-relational mapping):python

  
  
  
  

2.URL 分派:mysql

  
  
  
  

3.模版系統:jquery

  
  
  
  

4.表單處理:git

  
  
  
  

5.Cache系統:web

  
  
  
  

6.會話(session):ajax

  
  
  
  

7.國際化:

  
  
  
  

8.自動化的管理界面(Model):

  
  
  
  

(3)Django的經常使用命令:

  • 建立程序

    • django-admin startproject sitename # 在當前目錄下建立一個Django程序
  • 啓動服務器

    • python manage.py runserver ip:port # 啓動服務器,默認是127.0.0.1:8000
  • 建立APP

    • python manage.py startapp appname # 建立APP
  • 同步數據庫

    • python manage.py syncdb# 同步數據庫,Django 1.7及以上版本須要用如下的
  • 建立數據配置文件

    • python manage.py makemigrations # 建立數據配置文件,顯示並記錄全部數據的改動
  • 建立表結構

    • python manage.py migrate #建立表結構,將改動更新到數據庫
  • 建立超級管理員

    • python manage.py createsuperuser # 建立超級管理員
  • 啓動命令行模式

    • python manage.py dbshell # 數據庫命令行
  • 查看命令列表

    • python manage.py # 查看命令列表

 

(4)Django數據庫相關:

☆默認使用SQLite3數據庫的配置:

  
  
  
  

 

☆MySQL的配置:

  
  
  
  

導入 PyMySQL模塊

因爲Python開發經常使用Python3.x,Django鏈接數據庫的時候使用的是MySQL的MySQLdb模塊,然而在Python3中尚未此模塊,所以須要使用pymysql進行代替,下面的配置代碼寫入到項目目錄的init.py中便可:

  
  
  
  

 

☆PostgreSQL數據庫的配置:

  
  
  
  

 

☆Oracle數據庫的配置:

  
  
  
  

Django框架對於開發者而言高度透明化,對於不一樣數據庫的具體使用方法是一致的,改變數據庫類型只須要變更上述配置便可。

 

☆Django中的Model數據庫操做:

Django提供了一個抽象層(「Model」)來構建和管理Web應用程序的數據。Django中遵循 Code Frist 的原則,即:根據代碼中定義的類來自動生成數據庫表。關係對象映射(Object Relational Mapping,簡稱ORM)。

建立Django項目後的目錄結構:

  
  
  
  

 

★建立基本表結構:

  
  
  
  

# file:models.py

  
  
  
  

執行命令: python manage.py makemigrations

  
  
  
  

執行命令:python manage.py migrate

  
  
  
  

可視化以下:

blob.png

其餘的字段參數:

  1. null = True # 數據庫字段是否能夠爲空
  2. blank = True # django的 Admin 中添加數據時是否可容許空值
  3. primary_key = False # 主鍵,對AutoField設置主鍵後,就會代替原來的自增 id 列
  4. auto_now # 自動建立,不管添加或修改,都是當前操做的時間
  5. auto_now_add # 自動建立永遠是建立時的時間
  6. 選擇:
  
  
  
  

 

  1. max_length # 長度,是CharField必須屬性
  2. default # 默認值
  3. verbose_name # Admin中字段的顯示名稱
  4. name|db_column # 數據庫中的字段名稱
  5. unique = True # 不容許重複
  6. db_index = True # 數據庫索引
  7. editable = True # 在Admin中是否能夠編輯
  8. error_messages = None # 錯誤提示
  9. auto_created = False # 自動建立

16.help_text # 在Admin中提示幫助信息

  1. validators = []
  2. *upload-to**

其餘的字段:

1. models.AutoField

  • 自增列,int類型,若是沒有設置,默認會生成一個名稱爲id的列,若是要顯示一個自定義的自增列,必須將其設置爲主鍵

2. models.CharField

  • 字符串字段,必須設置max_length屬性

3. models.BooleanField

  • 布爾類型,在數據庫中的類型使用tinyint類型構造實現,不能爲空

4. models.ComaSeparatedIntegerField

  • 用逗號分割的數字,在數據庫中是varchar類型,繼承自CharField,因此必須 max_lenght 屬性

5. models.DateField

  • 日期類型,在數據庫中對應date類型,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次建立添加,以後的更新再也不改變。

6. models.DateTimeField

  • 日期類型,在數據庫中對應datetime,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次建立添加,以後的更新再也不改變。

7. models.Decimal

  • 十進制小數類型,在數據庫中對應decimal類型,必須指定整數位max_digits和小數位decimal_places

8. models.EmailField

  • 字符串類型(正則表達式郵箱),在數據庫中對應varchar類型

9. models.FloatField

  • 浮點類型,在數據庫中對應double類型

10. models.IntegerField 

  • 整型,在數據庫中對應int類型

11. models.BigIntegerField 

  • 長整形
  1.  

        
        
        
        
  1. models.IPAddressField  
  • 字符串類型(ip4正則表達式)
  1. models.GenericIPAddressField  
  • 字符串類型(ip4和ip6是可選的),參數protocol能夠是:both、ipv四、ipv6,驗證時,會根據設置報錯
  1. models.NullBooleanField  
  • 容許爲空的布爾類型
  1. models.PositiveIntegerFiel  
  • 正數範圍的Integer
  1. models.PositiveSmallIntegerField  
  • 正數範圍的smallInteger
  1. models.SlugField  
  • 減號、下劃線、字母、數字
  1. models.SmallIntegerField  
  • 數字,數據庫中的字段有:tinyint、smallint、int、bigint
  1. models.TextField  
  • 字符串,在數據庫中對應longtext
  1. models.TimeField  
  • 時間 HH:MM[:ss[.uuuuuu]]
  1. models.URLField  
  • 字符串,地址正則表達式
  1. models.BinaryField  
  • 二進制

24.models.ImageField

  • 圖片
  1. models.FilePathField
  • 文件

 

元數據:

 

  • db_table = ‘TableName’ # 數據庫中生成的名稱,使用app名稱+下劃線+類名
  • index_tohether = [(‘pub_date’,’deadline’)] # 聯合索引
  • unique_together = ((‘drive’,’ restaurant’)) # 聯合惟一索引
  • verbose_name admin中顯示的名稱

 

觸發Model中的驗證和錯誤提示有兩種方式:

  1. DjangoAdmin中的錯誤信息會優先根據Admin內部的ModelForm錯誤信息提示,若是都成功,纔會再驗證Model的字段並顯示指定的錯誤信息。

更改Admin中的錯誤提示:

  
  
  
  
  1. 調用Model對象的clean_fields方法:
  
  
  
  

 

★連表操做:

一對多:models.ForeignKey(其餘表)

多對多:models.ManyToManyField(其餘表)

一對一:models.OneToOneField(其餘表)

1. 一對多:

  
  
  
  

2. 一對一:

  
  
  
  

3. 多對多:

  
  
  
  

 

★表的增刪改查:

1.對數據進行增長數據:

  
  
  
  

 

1.1也能夠直接傳入字典建立:

  
  
  
  

2. 刪除數據:

  
  
  
  

3.修改數據:

  
  
  
  

4.查詢數據:

  
  
  
  

 

★使用雙下劃線鏈接操做:

1.獲取個數:

  
  
  
  

2.比較大小:

  
  
  
  

3.是否包含:

  
  
  
  

4.是否爲空:

  
  
  
  

5.contains:

  
  
  
  

6. range範圍:

  
  
  
  

7.其餘的操做:

  
  
  
  

8. order by:

  
  
  
  

9. group by:

  
  
  
  

10. limit 、offset:

  
  
  
  

11. regex正則匹配,iregex 不區分大小寫:

  
  
  
  

12.日期:

  
  
  
  

13.年月日周時分秒:

  
  
  
  

14.extra:

extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None),有些狀況下,Django的查詢語法難以簡單的表達複雜的 WHERE 子句,對於這種狀況, Django 提供了 extra() QuerySet 修改機制,它能在 QuerySet生成的SQL從句中注入新子句。不管什麼時候你都須要很是當心的使用extra(). 每次使用它時,您都應該轉義用戶可使用params控制的任何參數,以防止SQL注入攻擊。因爲產品差別的緣由,這些自定義的查詢難以保障在不一樣的數據庫之間兼容(由於你手寫 SQL 代碼的緣由),並且違背了 DRY 原則,因此如非必要,仍是儘可能避免寫 extra。

  
  
  
  

 

★F和Q:

from django.db.models import F

models.Tb1.objects.update(num=F('num')+1) #F用於拿到原始數據

# ##方式一:

  
  
  
  

# ##方式二:

  
  
  
  

 

★執行原生SQL:

  
  
  
  

 

★利用雙下劃線和 _set 將表之間的操做鏈接起來:

  
  
  
  

2.一對一操做:

  
  
  
  

3.一對多操做:

  
  
  
  

# 正向查找一對多

  
  
  
  

# 反向查找一對多

  
  
  
  

4.多對多操做:

  
  
  
  

# 添加數據

#group_obj.user_info.add(user_info_obj)

\#group_obj.user_info.add(*user_info_objs)

# 刪除數據

  
  
  
  

# 添加數據

  
  
  
  

# 刪除數據

  
  
  
  

# 獲取數據

  
  
  
  

# 獲取數據

  
  
  
  

# 添加多對多

  
  
  
  

 

(5)Django路由系統:

Django的路由系統本質就是URL正則與調用的視圖函數之間的映射表,URL的加載是從配置中開始的。

這樣Django也就很好的支持了靜態路由,基於正則的動態路由,以及二級路由,一樣開發人員也能夠自行使用基於請求方法的路由。

  
  
  
  

參數是可選的要傳遞給視圖函數的默認參數(字典形式)

別名也是可選的

例如:

  
  
  
  

其餘使用正則的例子:

  
  
  
  

說明:

  1. 要捕獲從URL中的值,用括號括起來,會當參數傳入 views 視圖。
  2. 沒有必要添加一個斜線,由於每一個URL都有。例如,它articles不是/articles。
  3. 在'r'前面的每一個正則表達式字符串中是可選的,但建議。它告訴Python字符串是「原始」 -沒有什麼字符串中應該進行轉義。

使用正則分組:

  
  
  
  

Django的二級路由示例:

  
  
  
  

須要注意的是,當你加上參數時,對應函數views.year_archive必須加上一個參數,參數名也必須命名爲 foo,這樣就實現了參數名的靜態綁定,放置參數順序出錯。

(6)Django的View視圖函數:

HTTP中產生的兩大對象:

  1. HTTP請求:HttpRequest
  2. HTTP應答:HttpResponse

☆HttpRequest對象:

當請求一個HTML頁面的時候,Django將會建立一個HttpRequest對象包含原數據的請求,而後Django加載適合的視圖,經過HTTPRequest做爲視圖函數的一地個參數。每一個視圖負責返回一個HttpResponse響應。

HttpRequest對象的屬性:

  1. path:請求頁面的全路徑,不包括域名
  2. method:請求中使用的HTTP方法的字符串表示。全大寫表示。例如
  
  
  
  

GET: 包含全部HTTP GET參數的類字典對象

POST:包含全部HTTP POST參數的類字典對象

服務器收到空的POST請求的狀況也是可能發生的,也就是說,表單form經過HTTP POST方法提交請求,可是表單中可能沒有數據,所以不能使用if req.POST來判斷是否使用了HTTP POST 方法;應該使用if req.method=="POST"。

  1. COOKIES:

    • *包含全部cookies的標準Python字典對象;keys和values都是字符串。**
  2. FILES:

    • 包含全部上傳文件的類字典對象;FILES中的每個Key都是標籤中 name屬性的值,FILES中的每個value同時也是一個標準的python字典對象,包含下面三個Keys:
    • filename:上傳文件名,用字符串表示
    • content_type:上傳文件的Content Type
    • content:上傳文件的原始內容

5. user:

是一個django.contrib.auth.models.User對象,表明當前登錄的用戶。若是訪問用戶當前沒有登錄,user將被初始化爲django.contrib.auth.models.AnonymousUser的實例。能夠經過user的is_authenticated()方法來辨別用戶是否登錄:
  
  
  
  

6. session:

  • 惟一可讀寫的屬性,表明當前會話的字典對象;本身有激活Django中session支持時該屬性纔可用。

7. META:

一個標準的Python字典包含全部可用的HTTP頭。可用標題取決於客戶端和服務器,一些例子:

  
  
  
  

☆HttpResponse對象屬性:

對於HtppResponse對象來講,是由Django自動建立的牡丹石HTTPResponse對象必須開發人員手動建立,每一個View請求處理方法必須返回一個HTTPResponse對象。

HTTPResponse對象經常使用的方法:

  1. 頁面渲染,render,render_to_response,推薦使用render,由於render功能更爲強大。
  2. 頁面跳轉,redirect
  3. 頁面傳參,locals,能夠直接將對應視圖中的全部變量所有傳遞給模板。
  • 示例代碼:
  
  
  
  

對於render的:

  
  
  
  

結合給定的模板與一個給定的上下文,返回一個字典HttpResponse在渲染文本對象。

  • request和template_name是必須參數,request指的是傳來的resquest,template_name指的是HTML模板或模板序列的名稱,若是給定的是序列,那麼序列中的第一個模板將被引用。
  • context 一組字典的值添加到模板中。默認狀況下,這是一個空的字典。
  • content_type MIME類型用於生成文檔。
  • status 爲響應狀態代碼。默認值爲200
  • using 這個名字一個模板引擎的使用將模板。

(7)Django模板和模板語言:

要使用模板,必然會牽扯到靜態文件的配置,好比CSS,Js等,在Django的項目目錄中的settings.py中追加:

 

  
  
  
  

其中static是存放靜態文件的目錄,這樣就能在HTML頁面中引用特效或者圖片了。對於模板,其實就是讀取模板,模板中嵌套着標籤,而後渲染數據的時候,從Model中取出數據插入到模板中,最後用戶接收到請求的響應。

模板語言:

  
  
  
  

繼承:

  
  
  
  

其餘經常使用方法:

  
  
  
  

在字典中取出數據使用dict.some的形式

自定義標籤:

由於在模板語言中不能進行邏輯運算,因此在Django中提供兩種自定義的標籤,

  • 一種是simple_tag,
  • 另外一種是filter。

simple_tag能夠傳遞任意參數,可是不能用做布爾判斷,filter最多隻能傳遞2個參數,能夠用作布爾判斷,一樣的,simple_tag和filter的實現是相似的。

示例代碼:

  
  
  
  

在HTML文件中導入以前建立的Python文件,使用load命令:

  
  
  
  

使用simple_tag:

  
  
  
  

須要在項目目錄中的settings.py中配置當前的APP:

  
  
  
  

(8)Django的中間件:

中間件示意圖:

blob.png

每一次用戶的請求都會一層一層穿過中間件,當不符合中間件的業務邏輯的時候就會直接返回,用戶請求到達不了最裏層的業務邏輯處理函數,這樣能夠自定義中間件,在不使用Nginx等第三方工具的時候統計每次用戶的訪問次數。

中間件其實就是一個Python文件,可是其中的類須要繼承自

from django.utils.deprecation import MiddlewareMixin

在這個文件中能夠建立以下5中函數:

# 請求到來以前執行

  
  
  
  

# 數據返回以前執行

  
  
  
  

# 執行view中的方法以前執行

  
  
  
  

# 程序出錯時執行

  
  
  
  

# 渲染模板數據時執行

  
  
  
  

須要在項目目錄中的settings.py文件中設置:

  
  
  
  
相關文章
相關標籤/搜索