Django 架構快速入門

來源:互聯網
上載者:User
1. Django是什麼

  Django 是一個進階的 Python Web 架構,它最初是加拿大勞倫斯出版集團用於管理旗下新聞網站內容的設計。它鼓勵快速開發和清潔,負責 Web 開發的許多麻煩,因此開發人員可以專註於編寫應用程式,而不需要重新製作輪子。Django 於2005年7月在BSD許可證下發布。
  以下優點可能會讓你考慮 Django 架構: Django 是免費和開源的; Django 很全面,被稱為完美主義者的 Web 架構; 可以更快地構建更好的 Web 應用程式並減少代碼; (Django 的宗旨在於協助開發人員快速從概念到完成應用程式) Django 的 MVC 設計十分優美; Django 提供快速、靈活擴充的能力; 可以在 Django 中使用原始的 SQL 陳述式; Django 內建一個管理介面……

  Django 是一個大而全的 Web 架構,但是定製起來需要花費一些學習時間。
  更多介紹:https://www.djangoproject.com/ 2. MVC 和 MVT

  MVC 是典型的網站開發設計模式,MVC 是 Model-View-Controller 的縮寫,其中: Model,模型建模:其指將對象資源間的關係映射到資料庫表格中,主要封裝對資料庫層的訪問,對資料庫中的資料進行 CURD 操作; View,視圖:其指我們看到的網頁外觀,同時還需要使用網頁模板,用於封裝結果,產生 HTML 頁面; Controller,控制器:每個網頁需要實現的功能,由對應於該網頁路徑的函數實現,該函數就是控制器,用於接收請求、處理商務邏輯、整合模型(資料庫)和視圖(網頁)。

但是呢,Django 的 MVC 與傳統的 MVC 有所不同,屬於 MVT 架構,其中: M 表示 Model:與 MVC 中的 M 功能相同,負責與資料庫互動、進行資料處理; V 表示 View:與 MVC 中的 C 功能相同,負責接收請求、擷取資料、返回結果; T 表示 Template:與 MVC 中的 V 功能相同,負責封裝構造要返回的 HTML 頁面。

注意:處理用戶端和伺服器之間的 http 請求響應需要實現 wsgi 協議。

Python Web 服務器網關介面(Python Web Server Gateway Interface,縮寫為 WSGI)是 Python 應用程式或架構和 Web 服務器之間的一種介面,已經被廣泛接受,基本達成可移植性方面的目標。 3. 安裝Django

  開啟 Django 官網的 download 頁面,上面有詳細的安裝方法。我們要注意的是版本的選擇,以下是官方的版本發布計劃:

  開發環境可以使用較新的版本,但生產環境建議使用 LTS 版本。
  我的實驗環境是 64位 Ubuntu 16.04,Python 版本 3.5.2,pip 版本 9.0.3,準備安裝的 Django 版本為 1.11.11。安裝過程如下:
  使用 pip 線上安裝:

$ pip install django==1.11.11

  這樣安裝的話,會安裝到 Python 的預設目錄中,我們可以用 pip show 查看:

$ pip show djangoName: DjangoVersion: 1.11.11Summary: A high-level Python Web framework that encourages rapid development and clean, pragmatic design.Home-page: https://www.djangoproject.com/Author: Django Software FoundationAuthor-email: foundation@djangoproject.comLicense: BSDLocation: /usr/local/lib/python3.5/dist-packagesRequires: pytz

  也可以先下載安裝包,再指定目錄安裝:

$ pip download django=1.11.11 -d ./$ pip install Django-1.11.11-py2.py3-none-any.whl

  檢查一下,確保安裝成功:

$ pip freeze$ python3 -m django --version
4. 項目的建立與運行 4.1 建立項目

  如果你和我一樣,第一次使用 Django,那麼現在進入你的工作目錄,然後執行如下命令,這會自動產生一些建立 Django 項目的代碼。

$ django-admin startproject myweb

  進入 myweb 目錄,看看 startproject 建立了什麼東西:

$ tree.├── manage.py└── myweb    ├── __init__.py    ├── settings.py    ├── urls.py    └── wsgi.py

這些目錄和檔案的作用如下: 外部 myweb/ 根目錄只是一個項目的容器。它的名字與 Django 無關; 您可以將其重新命名為您喜歡的任何內容。 manage.py:一個命令列公用程式,可以讓您以各種方式與此 Django 項目進行互動。你可以閱讀所有的細節 manage.py 在 Django 的管理和 manage.py。 內部 myweb/ 目錄是您的項目的實際 Python 包。它的名字是您需要用來匯入其中的任何內容的 Python 包名稱(例如myweb.urls)。 myweb/__init__.py:一個空的檔案,告訴 Python 這個目錄應該被認為是一個 Python 包。 myweb/settings.py:此 Django 項目的設定/配置。 Django 設定會告訴你所有關於設定的工作原理。 myweb/urls.py:該 Django 項目的 URL 聲明; 您的 Django 動力網站的“目錄”。 myweb/wsgi.py:WSGI 相容的 Web 服務器為您的項目提供服務的進入點。 4.2 運行程式開發伺服器

  在外部 myweb/ 目錄下,執行如下命令:

$ python3 manage.py runserver

  此時,我們的 Django 程式開發伺服器就運行起來了,但是可能會出現如下警告:

You have unapplied migrations; your app may not work properly until they are applied.Run 'python manage.py migrate' to apply them.

  這是因為伺服器預設串連 SQLite 資料庫,而我們當前還沒有資料庫或者沒有正確配置,暫時忽略。
  然後開啟瀏覽器,輸入 http://127.0.0.1:8000/ ,看到如下頁面說明我們的 Django 程式開發伺服器已經運行起來了。

  預設情況下,runserver 命令在 8000 連接埠的內部 IP 上啟動程式開發伺服器。如果想指定連接埠開啟服務,如 8080 連接埠,可以這樣:

$ python3 manage.py runserver 8080

  當然,我們還可以指定 IP,比如我的實驗環境的 IP 是 192.168.66.169,可以這樣:

$ python3 manage.py runserver 192.168.66.169:8080

  或者是:

$ python3 manage.py runserver 0:8080

  注意:0 是 0.0.0.0 的簡寫,是一個特殊的 IP 位址,代表的是本機所有 IP 位址,而不管有多少個網口,多少個 IP,監聽原生 0.0.0.0 上的 8080 連接埠就等於監聽機器上的所有 IP 的 8080 連接埠。
  但是這個時候,我們在瀏覽器輸入 http://192.168.66.169:8000/,可能會看到如下頁面:

  這是因為 Django 程式開發伺服器預設只能本地訪問,所有我們還要配置下 myweb/settings.py 中的 ALLOWED_HOSTS,比如:

ALLOWED_HOSTS = ['192.168.66.169','localhost','127.0.0.1']

  或者乾脆這樣,表示支援所有:

ALLOWED_HOSTS = ['*']

注意:這裡啟動的是一個純粹以Python編寫的輕量級Web伺服器,其與 Django 結合在一起,因此開發人員可以快速開發,而無需處理配置生產伺服器(如Apache),直到您準備好生產。 5. 應用的建立與使用 5.1 建立一個應用程式

  Django 內建一個公用程式,可以自動產生應用程式的基本目錄結構,因此您可以專註於編寫代碼而不是建立目錄。在外部 myweb/ 目錄,執行如下命令:

$ python3 manage.py startapp myapp

  我們發現多了一個 myapp/ 目錄,展開如下:

$ tree myapp/myapp/├── admin.py├── apps.py├── __init__.py├── migrations│   └── __init__.py├── models.py├── tests.py└── views.py
5.2 編寫第一個視圖

  開啟 myapp/views.py 檔案,並添加以下 Python 代碼:

from django.http import HttpResponsedef index(request):    return HttpResponse("Hello, world. You're at the myapp index. 喵")

  這是 Django 中最簡單的視圖,要調用視圖,我們需要將其映射到一個URL。因此,我們需要一個 URLconf —— 在 myapp 目錄中建立一個 URLconf,建立一個名為 urls.py 的檔案。
  編輯 myapp/urls.py 檔案,內容如下:

from django.conf.urls import urlfrom . import viewsurlpatterns = [    url(r'^$', views.index, name='index'),]

  緊接著,我們還要將根 URLconf 指向 myapp.urls 模組。編輯 myweb/urls.py 中的 urlpatterns 列表,如下:

from django.conf.urls import include, urlfrom django.contrib import adminurlpatterns = [    url(r'^admin/', admin.site.urls),    url(r'^myapp/', include('myapp.urls')),]

  這裡用到了 include() 函數,所以我們需要 import django.conf.urls.include ,include() 函數允許引用其他的 URLconfs。
  注意:include() 函數的Regex沒有$(字串匹配字元),而是尾部的斜杠。每當 Django 遇到時 include(),它會排除與該點匹配的任何部分,並將剩餘的字串發送到隨附的 URLconf 做進一步處理。
  好啦,現在重新運行 django 程式開發伺服器:

$ python3 manage.py runserver 0:8000

  瀏覽器輸入 http://localhost:8000/myapp/,可以看到如下頁面:

5.3 url() 函數介紹

  Django 的 url() 函數可以接收四個參數,分別是兩個必選參數:regex、view,以及兩個選擇性參數:kwargs、name。 regex:Regex,與之匹配的 URL 會執行對應的第二個參數 view view:用於執行與Regex匹配的 URL 請求 kwargs:視圖使用的字典類型的參數 name:用來反向擷取 URL 6. 項目的模型 6.1 串連MySQL資料庫設定

  在 myweb/settings.py 中,有如下代碼:

DATABASES = {    'default': {        'ENGINE': 'django.db.backends.sqlite3',        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),    }}

  也就是說,Django 預設配置使用 SQLite。如果不使用 SQLite 作為資料庫,則需要額外的設定,例如我們本樣本中使用 MySQL 資料庫,必須添加 USER,PASSWORD 和 HOST 等配置資訊。
  在我的本地 MySQL 中,已經提前建立了一個名為 django-test 的資料庫用於測試。


  最終的 DATABASES 配置如下:

DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql',        'NAME': 'django-test',        'USER': 'root',        'PASSWORD': '',        'HOST': 'localhost',        'PORT': '3306',    }}

  注意:Django 使用 MySQL 資料庫需要安裝 PyMySQL,如果小夥伴們還沒安裝的話,可以執行如下命令安裝:

$ pip install pymysql

  然後在 myweb/__init__.py 中添加以下代碼,匯入 pymysql:

import pymysqlpymysql.install_as_MySQLdb()
6.2 建立模型

  下面,在我們的前面建立的應用程式中,建立一個 stu 表資訊操作的 Model 類。編輯 myapp/models.py 檔案,內容如下:

from django.db import models# Create your models here.class Stu(models.Model):    '''自訂Stu表對應的Model類'''    #定義屬性:預設主鍵自增id欄位可不寫    id = models.AutoField(primary_key=True)    name = models.CharField(max_length=16)    age = models.SmallIntegerField()    sex = models.CharField(max_length=1)    classid=models.CharField(max_length=8)    # 定義預設輸出格式    def __str__(self):        return "%d:%s:%d:%s:%s"%(self.id,self.name,self.age,self.sex,self.classid)    # 自訂對應的表名,預設表名:myapp_stu    class Meta:        db_table="stu"
6.3 啟用模型

  啟用模型,也就是要將該應用程式套件組合括在我們的項目中,需要在設定中添加對其配置類的引用 INSTALLED_APPS。MyappConfig 類在 myapp/apps.py 檔案中,所以它的路徑 應該是“myapp.apps.MyappConfig”。
  編輯 myweb/settings.py 檔案,並將該路徑添加到該 INSTALLED_APPS 設定,如下:

INSTALLED_APPS  =  [     'django.contrib.admin' ,    'django.contrib.auth' ,    'django.contrib.contenttypes' ,    'django.contrib.sessions' ,    'django.contrib.messages' ,    'django.contrib.staticfiles' ,    'myapp.apps.MyappConfig',  #或者直接寫 myapp]
6.4 使用模型

  下面展示如何擷取模型的資料,在此之前,我們已經在 django-test 資料庫中建立好 stu 資料表,並且添加裡一些資料。如下所示:

  接下來我們通過兩種方法來使用該模型。

6.4.1 進入互動Python shell 使用Django的API操作

  進入 Python Shell 互動介面:

$ python3 manage.py shell

  一個簡單的互動過程如下所示,先匯入 Stu,然後擷取模型所有資訊,接著把所有記錄列印出來,我們也可以擷取單條資訊。

Python 3.5.2 (default, Nov 23 2017, 16:37:01) Type "copyright", "credits" or "license" for more information.IPython 2.4.1 -- An enhanced Interactive Python.?         -> Introduction and overview of IPython's features.%quickref -> Quick reference.help      -> Python's own help system.object?   -> Details about 'object', use 'object??' for extra details.In [1]: from myapp.models import StuIn [2]: mod = Stu.objectsIn [3]: lists = mod.all()In [4]: for v in lists:   ...:     print(v)   ...:     1:Apple:8:female:12:Rudy:10:male:13:Tina:9:female:14:Alexander:6:male:15:Carrie:5:female:16:Joe:7:female:17:Elsa:11:female:18:Blaise:12:male:19:Lisa:12:female:210:Jhon:12:male:2In [5]: mod.get(id=1)Out[5]: <Stu: 1:Apple:8:female:1>In [6]: mod.get(id=2)Out[6]: <Stu: 2:Rudy:10:male:1>In [7]: mod.get(id=3)Out[7]: <Stu: 3:Tina:9:female:1>In [8]: quit

  注意:我這裡安裝裡 ipython,它是一個增強版的 Python Shell,所以跟你操作的提示可能不一樣。Ubuntu 安裝 ipython 的方法很簡單:$ sudo apt-get install ipython。

6.4.2 在myapp應用的視圖中使用

  編輯 myapp/views.py 檔案,匯入 Stu,實現 stu 函數:

from django.shortcuts import renderfrom django.http import HttpResponsefrom myapp.models import Stu# Create your views here.def index(request):    return HttpResponse("Hello, world. You're at the myapp index. 喵")    #return render(request, "index.html")def stu(request):    #擷取所有stu表資訊    lists = Stu.objects.all()    print(lists)    #擷取單條學生資訊    print(Stu.objects.get(id=1))    return HttpResponse("ok")

  別忘了。還要在 myapp/urls.py 中配置 stu 函數的訪問路由:

url(r'^stu$', views.stu),

  重啟 django 程式開發伺服器,在瀏覽器輸入 http://localhost:8000/myapp/stu 。 7. 啟用網站後台管理

  Django 架構中有一個非常強大的應用功能——自動管理介面,常被 Web 平台管理者使用,用以管理整個 Web 平台。 7.1 資料移轉

  第一次啟用後台管理,首先要進行資料移轉。資料移轉就是將 Django 提供的後台管理模組的資料移轉至 myweb 的資料庫,所以如果你的 myweb 還沒有串連資料庫,趕緊回到 6.1 節吧。
  預設情況下,在 settings.py 設定檔中 INSTALLED_APPS 包含以下應用程式,這些應用程式都是由 Django 提供: django.contrib.admin - 管理網站。你會很快使用它。 django.contrib.auth - 認證系統。 django.contrib.contenttypes - 內容類型的架構。 django.contrib.sessions - 會話架構 django.contrib.messages - 訊息架構。 django.contrib.staticfiles - 管理靜態檔案的架構。

  使用這些 Django 內建的應用程式,需要我們在資料庫中建立一些資料表對應,然後才能使用它們。因此,我們運行以下命令進行資料結構遷移:

$ python3 manage.py migrate

  migrate 命令會查看 INSTALLED_APPS 設定,並根據 myweb/settings.py 檔案中的資料庫設定和應用程式隨附的資料庫遷移建立任何必需的資料庫表。
  看看 MySQL,多了好多張資料表:

  這時,訪問 http://localhost:8000/admin/,進入後台登入介面,咦~ 帳號/密碼呢。

7.2 建立管理使用者

  沒錯,我們還需要建立一個可以登入管理網站的使用者(superuser)。執行如下命令:

$ python3 manage.py createsuperuser

  根據提示輸入使用者名稱和密碼等資訊即可。 7.3 啟動程式開發伺服器

  預設情況下,Django 管理員已經啟用,我們重啟程式開發伺服器就可以了:

$ python3 manage.py runserver 0:8000

  再登入管理後台,輸入剛剛建立的使用者名稱和密碼,登入成功。

7.4 設定時區和語言

  但是英文看不太習慣呀,切換成中文唄。編輯 myweb/settings.py 設定檔:

LANGUAGE_CODE = 'zh-hans'TIME_ZONE = 'Asia/Shanghai'

  重新整理,看到中文啦~

7.5 將自訂的應用程式加入到後台管理

  但是,我們的自訂應用程式在哪裡。並沒有顯示在後台管理索引頁面上。要做到這一點,開啟 myapp/admin.py 檔案,並編輯代碼如下:

from django.contrib import adminfrom myapp.models import Stuadmin.site.register(Stu)

  重新整理:

7.6 更深入設計後台管理

  編輯 myapp/models.py 檔案,在 Stu 類中添加如下資訊,讓後台管理顯示中文欄位:

class Stu(models.Model):    '''自訂Stu表對應的Model類'''    #定義屬性:預設主鍵自增id欄位可不寫    id = models.AutoField("學號",primary_key=True)    name = models.CharField("姓名",max_length=16)    age = models.SmallIntegerField("年齡")    sex = models.CharField("性別",max_length=1)    classid=models.CharField("班級",max_length=8)    # 定義預設輸出格式    def __str__(self):        return "%d:%s:%d:%s:%s"%(self.id,self.name,self.age,self.sex,self.classid)    # 自訂對應的表名,預設表名:myapp_stu    class Meta:        db_table="stu"        verbose_name = '瀏覽學生資訊'          verbose_name_plural = '學生資訊管理'

  編輯 myapp/admin.py 檔案,實現資訊管理的個人化定製:

from django.contrib 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.