Django框架詳細介紹


Django框架簡介

在我們學習python常見的框架有Django、Flask、Tornado等,Django框架相較於其他框架的優勢就是:大而全,框架的本身本身集成了ORM、模型綁定、模板引擎、緩存、Session等諸多功能。

接下來我們也介紹的也是這個大而全的Django框架。

MVC模型和MTV模型

MVC是眾所周知的模式,即:將應用程序分解成三個組成部分:model(模型),view(視圖),和 controller(控制 器)。其中:
      M——管理應用程序的狀態(通常存儲到數據庫中),並約束改變狀態的行為(或者叫做“業務規則”)。
      C——接受外部用戶的操作,根據操作訪問模型獲取數據,並調用“視圖”顯示這些數據。控制器是將“模型”和“視圖”隔離,並成為二者之間的聯系紐帶。
      V——負責把數據格式化后呈現給用戶。

Django框架本身也是一個MVC模型,但是在Django中,控制器接受用戶輸入的部分由框架自行處理,所以 Django 里更關注的是模型(Model)、模板(Template)和視圖(Views),稱為 MTV模式:

    M 代表模型(Model),即數據存取層。 該層處理與數據相關的所有事務: 如何存取、如何驗證有效性、包含哪些行為以及數據之間的關系等。

    T 代表模板(Template),即表現層。 該層處理與表現相關的決定: 如何在頁面或其他類型文檔中進行顯示。

    V 代表視圖(View),即業務邏輯層。 該層包含存取模型及調取恰當模板的相關邏輯。 你可以把它看作模型與模板之間的橋梁。

基本配置

創建Django項目

1、終端命令行操作:django-admin startproject sitename  (在當前目錄下創建一個Django程序)

2、IDE(pycharm):方法路徑,本質上都是執行了上述命令

其他常用命令:

  python manage.py runserver ip:port  (啟動服務器,默認ip和端口為http://127.0.0.1:8000/)

  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  (查看命令列表)
常用命令

Django程序目錄

一個新的Django項目創建成功之后,我們就要對這些文件進行一些具體的配置了...

創建、配置數據庫

首先,先創建一個新的數據庫,然后就可以開始對數據庫進行具體的配置了

1、先在settings.py文件下連接數據庫

2、在settings.py文件同級目錄下的__init__.py文件下

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

3、靜態文件的配置

# 首先在項目根目錄下創建static目錄

# 接着在settings.py 文件下添加

STATIC_URL = '/static/'  # 默認已添加,使用靜態文件時的前綴
STATICFILES_DIRS = (
        os.path.join(BASE_DIR,'static'), #行末的逗號不能漏
    )

# 這樣在template中就可以導入static目錄下的靜態文件啦

# 例:
<script src="/static/jquery-1.12.4.js"></script>
靜態文件

4、CSRF跨站請求偽造

在我們自己使用Django框架編寫代碼測試的時候需要將settings.py文件中的紅框中的那一行注釋,否則會報錯

我們的操作都沒辦法通過CSRF的驗證

csrf跨站請求偽造==>詳細解釋

Django應用(app)

Django應用是在Django項目中,使用Django項目的manage.py(等同於django-admin工具的項目定制版)創建

命令行創建:

python manage.py startapp app01

注意:我們使用命令行創建完應用一定要到settings.py文件中將創建好的app的名字添加到INSTALLED_APPS的配置中去

使用pycharm創建項目的時候創建應用

一個Django項目就是一個基於Django的Web應用。
一個Django項目中包含一組配置和若干個Django應用。
一個Django應用就是一個可重用的Python軟件包,提供一定的功能。
一個Django應用中可以包含models, views, templates, template tags, static files, URLs等。
一個Django項目可以包含多個Django應用。
一個Django應用也可以被包含到多個Django項目中,因為Django應用是可重用的Python軟件包。
Django項目和應用的關系

在settings.py文件中的變量INSTALLED_APPS該變量的值是一個list,給出在Django項目中包含的Django應用。Django框架默認情況下,Django項目中包含如下Django應用:

路由系統

 URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL模式以及要為該URL模式調用的視圖函數之間的映射表;你就是以這種方式告訴Django,對於這個URL調用這段代碼,對於那個URL調用那段代碼。URL的加載是從配置文件中開始。

參數說明:

  • 一個正則表達式字符串
  • 一個可調用對象,通常為一個視圖函數或一個指定視圖函數路徑的字符串
  • 可選的要傳遞給視圖函數的默認參數(字典形式)
  • 一個可選的name參數

簡單示例:

說明:

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

views視圖

一個視圖函數(類),簡稱視圖,是一個簡單的Python 函數(類),它接受Web請求並且返回Web響應。

響應可以是一張網頁的HTML內容,一個重定向,一個404錯誤,一個XML文檔,或者一張圖片。

FBV和CBV

基於函數的視圖就是FBV,基於類的視圖就是CBV

FBV示例

def add_class(request):
    if request.method == "POST":
        class_name = request.POST.get("class_name")
        models.Classes.objects.create(name=class_name)
        return redirect("/class_list/")
    return render(request, "add_class.html")

CBV示例

from django.views import View


class AddClass(View):

    def get(self, request):
        return render(request, "add_class.html")

    def post(self, request):
        class_name = request.POST.get("class_name")
        models.Classes.objects.create(name=class_name)
        return redirect("/class_list/")

如果我們使用CBV的話在urls.py文件中的對應關系也應該修改

# urls.py中
url(r'^add_class/$', views.AddClass.as_view()),

http請求中的兩個核心對象

  http請求:HttpRequest對象

  http響應:HttpResponse對象

Request

當一個頁面被請求時,Django就會創建一個包含本次請求原信息的HttpRequest對象。
Django會將這個對象自動傳遞給響應的視圖函數,一般視圖函數約定俗成地使用 request 參數承接這個對象

1、請求相關的常用值

path_info     返回用戶訪問url,不包括域名
method        請求中使用的HTTP方法的字符串表示,全大寫表示。
GET              包含所有HTTP  GET參數的類字典對象
POST           包含所有HTTP POST參數的類字典對象
body            請求體,byte類型 request.POST的數據就是從body里面提取到的

2、屬性

所有的屬性應該被認為是只讀的,除非另有說明。

屬性:
  django將請求報文中的請求行、頭部信息、內容主體封裝成 HttpRequest 類中的屬性。
   除了特殊說明的之外,其他均為只讀的。


0.HttpRequest.scheme
   表示請求方案的字符串(通常為http或https)

1.HttpRequest.body

  一個字符串,代表請求報文的主體。在處理非 HTTP 形式的報文時非常有用,例如:二進制圖片、XML,Json等。

  但是,如果要處理表單數據的時候,推薦還是使用 HttpRequest.POST 。

  另外,我們還可以用 python 的類文件方法去操作它,詳情參考 HttpRequest.read() 。

 

2.HttpRequest.path

  一個字符串,表示請求的路徑組件(不含域名)。

  例如:"/music/bands/the_beatles/"



3.HttpRequest.method

  一個字符串,表示請求使用的HTTP 方法。必須使用大寫。

  例如:"GET""POST"

 

4.HttpRequest.encoding

  一個字符串,表示提交的數據的編碼方式(如果為 None 則表示使用 DEFAULT_CHARSET 的設置,默認為 'utf-8')。
   這個屬性是可寫的,你可以修改它來修改訪問表單數據使用的編碼。
   接下來對屬性的任何訪問(例如從 GET 或 POST 中讀取數據)將使用新的 encoding 值。
   如果你知道表單數據的編碼不是 DEFAULT_CHARSET ,則使用它。

 

5.HttpRequest.GET 

  一個類似於字典的對象,包含 HTTP GET 的所有參數。詳情請參考 QueryDict 對象。

 

6.HttpRequest.POST

  一個類似於字典的對象,如果請求中包含表單數據,則將這些數據封裝成 QueryDict 對象。

  POST 請求可以帶有空的 POST 字典 —— 如果通過 HTTP POST 方法發送一個表單,但是表單中沒有任何的數據,QueryDict 對象依然會被創建。
   因此,不應該使用 if request.POST  來檢查使用的是否是POST 方法;應該使用 if request.method == "POST" 

  另外:如果使用 POST 上傳文件的話,文件信息將包含在 FILES 屬性中。

 7.HttpRequest.COOKIES

  一個標准的Python 字典,包含所有的cookie。鍵和值都為字符串。

 

8.HttpRequest.FILES

  一個類似於字典的對象,包含所有的上傳文件信息。
   FILES 中的每個鍵為<input type="file" name="" /> 中的name,值則為對應的數據。

  注意,FILES 只有在請求的方法為POST 且提交的<form> 帶有enctype="multipart/form-data" 的情況下才會
   包含數據。否則,FILES 將為一個空的類似於字典的對象。

 

9.HttpRequest.META

   一個標准的Python 字典,包含所有的HTTP 首部。具體的頭部信息取決於客戶端和服務器,下面是一些示例:

    CONTENT_LENGTH —— 請求的正文的長度(是一個字符串)。
    CONTENT_TYPE —— 請求的正文的MIME 類型。
    HTTP_ACCEPT —— 響應可接收的Content-Type。
    HTTP_ACCEPT_ENCODING —— 響應可接收的編碼。
    HTTP_ACCEPT_LANGUAGE —— 響應可接收的語言。
    HTTP_HOST —— 客服端發送的HTTP Host 頭部。
    HTTP_REFERER —— Referring 頁面。
    HTTP_USER_AGENT —— 客戶端的user-agent 字符串。
    QUERY_STRING —— 單個字符串形式的查詢字符串(未解析過的形式)。
    REMOTE_ADDR —— 客戶端的IP 地址。
    REMOTE_HOST —— 客戶端的主機名。
    REMOTE_USER —— 服務器認證后的用戶。
    REQUEST_METHOD —— 一個字符串,例如"GET""POST"。
    SERVER_NAME —— 服務器的主機名。
    SERVER_PORT —— 服務器的端口(是一個字符串)。
   從上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,請求中的任何 HTTP 首部轉換為 META 的鍵時,
    都會將所有字母大寫並將連接符替換為下划線最后加上 HTTP_  前綴。
    所以,一個叫做 X-Bender 的頭部將轉換成 META 中的 HTTP_X_BENDER 鍵。

 
10.HttpRequest.user

  一個 AUTH_USER_MODEL 類型的對象,表示當前登錄的用戶。

  如果用戶當前沒有登錄,user 將設置為 django.contrib.auth.models.AnonymousUser 的一個實例。你可以通過 is_authenticated() 區分它們。

    例如:

    if request.user.is_authenticated():
        # Do something for logged-in users.
    else:
        # Do something for anonymous users.
     

       user 只有當Django 啟用 AuthenticationMiddleware 中間件時才可用。

     -------------------------------------------------------------------------------------

    匿名用戶
    class models.AnonymousUser

    django.contrib.auth.models.AnonymousUser 類實現了django.contrib.auth.models.User 接口,但具有下面幾個不同點:

    id 永遠為None。
    username 永遠為空字符串。
    get_username() 永遠返回空字符串。
    is_staff 和 is_superuser 永遠為False。
    is_active 永遠為 False。
    groups 和 user_permissions 永遠為空。
    is_anonymous() 返回True 而不是False。
    is_authenticated() 返回False 而不是True。
    set_password()、check_password()、save() 和delete() 引發 NotImplementedError。
    New in Django 1.8:
    新增 AnonymousUser.get_username() 以更好地模擬 django.contrib.auth.models.User。

 

11.HttpRequest.session

   一個既可讀又可寫的類似於字典的對象,表示當前的會話。只有當Django 啟用會話的支持時才可用。
    完整的細節參見會話的文檔。
Request屬性

Response

對於HttpRequest對象來說,是由django自動創建的,但是,HttpResponse對象就必須我們自己創建。每個view請求處理方法必須返回一個HttpResponse對象。

在HttpResponse對象上擴展的常用方法:

  • 頁面渲染:render(推薦),render_to_response,
  • 頁面跳轉:redirect
  • locals:   可以直接將對應視圖函數中所有的變量傳給模板  

1、使用

傳遞字符串

from django.http import HttpResponse
response = HttpResponse("Here's the text of the Web page.")
response = HttpResponse("Text only, please.", content_type="text/plain")

設置或刪除響應頭信息

response = HttpResponse()
response['Content-Type'] = 'text/html; charset=UTF-8'
del response['Content-Type']

2、屬性

HttpResponse.content:響應內容

HttpResponse.charset:響應內容的編碼

HttpResponse.status_code:響應的狀態碼

JsonResponse

JsonResponse是HttpResponse的子類,專門用來生成JSON編碼的響應。

from django.http import JsonResponse

response = JsonResponse({'foo': 'bar'})
print(response.content)

b'{"foo": "bar"}'

默認只能傳遞字典類型,如果要傳遞非字典類型需要設置一下safe關鍵字參數。

response = JsonResponse([1, 2, 3], safe=False)

模板

1. 模板的執行

模版的創建過程,對於模版,其實就是讀取模版(其中嵌套着模版標簽),然后將 Model 中獲取的數據插入到模版中,最后將信息返回給用戶。

# view.py

def index(request):
    return render(request, 'index.html', {'title':'welcome'})


# index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <h1>{{ title }}</h1>
    </div>

</body>
</html>
示例

2、模板語言

只需要記兩種特殊符號:

{{  }}和 {% %}

變量相關的用{{}},邏輯相關的用{%%}。

 

內置Filters

語法: {{ value|filter_name:參數 }}

①、default

{{ value|default: "nothing"}}

如果value值沒傳的話就顯示nothing

②、length

{{ value|length }}

'|'左右沒有空格沒有空格沒有空格

返回value的長度,如 value=['a', 'b', 'c', 'd']的話,就顯示4.

③、filesizeformat

將值格式化為一個 “人類可讀的” 文件尺寸 (例如 '13 KB''4.1 MB''102 bytes', 等等)。例如:

{{ value|filesizeformat }}

如果 value 是 123456789,輸出將會是 117.7 MB。

④、slice

切片

{{value|slice:"2:-1"}}

⑤、date

格式化

{{ value|date:"Y-m-d H:i:s"}}

⑥、safe

Django的模板中會對HTML標簽和JS等語法標簽進行自動轉義,原因顯而易見,這樣是為了安全。但是有的時候我們可能不希望這些HTML元素被轉義,比如我們做一個內容管理系統,后台添加的文章中是經過修飾的,這些修飾可能是通過一個類似於FCKeditor編輯加注了HTML修飾符的文本,如果自動轉義的話顯示的就是保護HTML標簽的源文件。為了在Django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變量我們可以通過過濾器“|safe”的方式告訴Django這段代碼是安全的不必轉義。

比如:

value = "<a href='#'>點我</a>"

{{ value|safe}}

自定義Filters

自定義過濾器只是帶有一個或兩個參數的Python函數:

  • 變量(輸入)的值 - -不一定是一個字符串
  • 參數的值 - 這可以有一個默認值,或完全省略

例如,在過濾器{{var | foo:“bar”}}中,過濾器foo將傳遞變量var和參數“bar”

1、在app文件夾下建立一個新的Python Package包,包名必須叫templatetags

2. 在上面的包中新建一個python文件,里面定義函數,並且注冊到django的模板語言

3. 使用自定義的filter方法

{# 先導入我們自定義filter那個文件 #}
{% load 測試1 %}

{# 使用我們自定義的filter #}
{{ name|add:"dsb" }}

Tags

for

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}
</ul>

for循環可用的一些參數:

 

Variable Description
forloop.counter 當前循環的索引值(從1開始)
forloop.counter0 當前循環的索引值(從0開始)
forloop.revcounter 當前循環的倒序索引值(從1開始)
forloop.revcounter0 當前循環的倒序索引值(從0開始)
forloop.first 當前循環是不是第一次循環(布爾值)
forloop.last 當前循環是不是最后一次循環(布爾值)
forloop.parentloop 本層循環的外層循環

for ... empty

復制代碼
<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% empty %}
    <li>空空如也</li>
{% endfor %}
</ul>
復制代碼

if,elif和else

復制代碼
{% if user_list %}
  用戶人數:{{ user_list|length }}
{% elif black_list %}
  黑名單數:{{ black_list|length }}
{% else %}
  沒有用戶
{% endif %}
復制代碼

當然也可以只有if和else

{% if user_list|length > 5 %}
  七座豪華SUV
{% else %}
    黃包車
{% endif %}

if語句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判斷。

with

定義一個中間變量

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

注意事項

1. Django的模板語言不支持連續判斷,即不支持以下寫法:

{% if a > b > c %}
...
{% endif %}

補充:

 在JS中:

2. Django的模板語言中屬性的優先級大於方法

def xx(request):
    d = {"a": 1, "b": 2, "c": 3, "items": "100"}
    return render(request, "xx.html", {"data": d})

如上,我們在使用render方法渲染一個頁面的時候,傳的字典d有一個key是items並且還有默認的 d.items() 方法,此時在模板語言中:

{{ data.items }}

默認會取d的items key的值

母板

母板中主要放置公共的HTML代碼,以及一些CSS樣式和JS塊,方便子頁面進行替換

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="x-ua-compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Title</title>
  {% block page-css %}
  
  {% endblock %}
</head>
<body>

<h1>這是母板的標題</h1>

{% block page-main %}

{% endblock %}
<h1>母板底部內容</h1>
{% block page-js %}

{% endblock %}
</body>
</html>

子頁面繼承母版

在子頁面中在頁面最上方使用下面的語法來繼承母板。

{% extends 'layouts.html' %}

塊(block)

通過在母板中使用{% block  xxx %}來定義"塊"。

在子頁面中通過定義母板中的block名來對應替換母板中相應的內容。

{% block page-main %}
  <p>世情薄</p>
  <p>人情惡</p>
  <p>雨送黃昏花易落</p>
{% endblock %}

組件

可以將常用的頁面內容如導航條,頁尾信息等組件保存在單獨的文件中,然后在需要使用的地方按如下語法導入即可。

{% include 'navbar.html' %}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com