Django 是 Python 的 一款 Web 開發框架,另外還有 Tornado,Flask,Twisted。爲何我要選擇學 Django?緣由很簡單,上家公司來了個網易的測開,就是用 Django 開發的測試平臺。html
這位測開沒多久就離職去騰訊了,我啥也沒學到,看了他的代碼,不少是寫的 Vue 代碼,哭啊。前端
Django 誕生於 2003 年的秋天,由 Lawrence Journal-World 報紙的程序員 Adrian Holovaty 和 Simon Willison 編寫而成。新聞編輯室的開發節奏是很是快的,正因如此,Django 相比於其餘框架的特色就是短、平、快。這也符合 Python 的風格。時至今日,Django 已經發展到了 3.1.3 版本。本系列將基於這一版本的官方文檔,邊學習邊實踐,整理成文,分享給你們。python
Django 系列不是教程,而是學習筆記、心得體會、踩坑記錄,內容編排上可能會有點亂。須要看教程請閱讀官方文檔,水平有限,實在抱歉。程序員
Django 遵循 MVC 架構模式,因此接下來就看看如何使用 Django 完成 Web 開發。特別注意,本文的內容不具備實操性,看看便可。正則表達式
model 是數據模型,定義了數據庫的表和字段。shell
例如:數據庫
from django.db import models class Reporter(models.Model): full_name = models.CharField(max_length=70) def __str__(self): return self.full_name class Article(models.Model): pub_date = models.DateField() headline = models.CharField(max_length=200) content = models.TextField() reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE) def __str__(self): return self.headline
經過類和屬性,分別定義了 2 張表 Reporter 和 Article,以及它們的字段(Reporter 1 個字段,Article 4 個字段)。django
這其實就是 ORM,即 Object Relational Mapping,對象關係映射,把程序代碼中的對象映射到關係型數據庫中,不用寫 SQL,就能夠直接操做數據了。ORM 實現了數據持久化。咱們都知道程序是運行在內存中的,跑完就沒了。爲了把數據保存下來,就須要使用 ORM 技術把內存中的數據(程序對象)存到關係型數據庫中,進而轉移到磁盤上。Django 自帶了一個 ORM,開箱即用。後端
使用 2 條命令,就能夠把 model 遷移到數據庫中:架構
$ python manage.py makemigrations $ python manage.py migrate
執行完成後,就會在數據庫中按照 model 定義的表名、字段名、約束條件等,建立表結構。
接着就能夠在程序中寫代碼操做數據了。爲了直觀看到結果,這裏以命令行形式進行演示:
# 導入已建立的 models >>> from news.models import Article, Reporter # 查詢表 Reporter 爲空 >>> Reporter.objects.all() <QuerySet []> # 實例化對象,建立 1 條數據,表 Reporter 的字段是 full_name >>> r = Reporter(full_name='John Smith') # 必須顯式調用 save() 函數,纔會真正寫數據到數據庫 >>> r.save() # 保存後就有 id 了 >>> r.id 1 # 查詢表 Reporter 有數據了 >>> Reporter.objects.all() <QuerySet [<Reporter: John Smith>]> # 訪問對象屬性 >>> r.full_name 'John Smith' # Django 提供了 get() 函數來支持更多查詢方式 >>> Reporter.objects.get(id=1) <Reporter: John Smith> >>> Reporter.objects.get(full_name__startswith='John') <Reporter: John Smith> >>> Reporter.objects.get(full_name__contains='mith') <Reporter: John Smith> >>> Reporter.objects.get(id=2) Traceback (most recent call last): ... DoesNotExist: Reporter matching query does not exist. # 給表 Article 添加 1 條數據 # 有 4 個字段 pub_date, headline, content, reporter # reporter=r,用 Reporter 對象賦值 >>> from datetime import date >>> a = Article(pub_date=date.today(), headline='Django is cool', ... content='Yeah.', reporter=r) >>> a.save() # 表 Article 也有數據了 >>> Article.objects.all() <QuerySet [<Article: Django is cool>]> # a.reporter 能夠賦值給 r >>> r = a.reporter >>> r.full_name 'John Smith' # r 也能夠訪問 Article >>> r.article_set.all() <QuerySet [<Article: Django is cool>]> # 能夠藉助 filter() 函數按條件過濾數據 >>> Article.objects.filter(reporter__full_name__startswith='John') <QuerySet [<Article: Django is cool>]> # 賦值後調用 save() 函數更新數據 >>> r.full_name = 'Billy Goat' >>> r.save() # 使用 delete() 函數刪除對象,數據庫這條數據也會被刪除 >>> r.delete()
通常不會用它。
咱們是經過 URL 發送請求的,服務端程序作處理,處理的函數叫作回調函數。Django 在 urls.py 文件中編寫 URL 和回調函數的映射關係。例如:
from django.urls import path from . import views urlpatterns = [ path('articles/<int:year>/', views.year_archive), path('articles/<int:year>/<int:month>/', views.month_archive), path('articles/<int:year>/<int:month>/<int:pk>/', views.article_detail), ]
path()
的第一參數是 URL,這裏使用了 <>
參數標籤來獲取 URL 中的數據,而後傳入到回調函數中。第二個參數是回調函數,位於 views 中。
若是請求 URL 「/articles/2005/05/39323/」,Django 就會獲取參數值後調用回調函數:
news.views.article_detail(request, year=2005, month=5, pk=39323)
Django 在啓動加載時就會把這些 path 編譯爲正則表達式,查找速度飛快。匹配到第一個後就會中止查找,調用回調函數。若是找完了都沒有,就會調用 404 這個特殊 view,表示沒找到。
在 views 中編寫回調函數。每一個回調函數只作 1 件事,要麼返回包含響應的 HttpResponse
對象,要麼拋出異常,如 Http404
。例如:
from django.shortcuts import render from .models import Article def year_archive(request, year): a_list = Article.objects.filter(pub_date__year=year) context = {'year': year, 'article_list': a_list} return render(request, 'news/year_archive.html', context)
return render() 函數會返回一個 HttpResponse
對象。
注意,這個例子用到的是 Django 自帶的模板引擎。所謂模板引擎,就是前端的 HTML 模板,裏面的數據能夠寫成變量,從後端動態獲取。除了內置的這個,還有其餘模板引擎如 Thymeleaf、FreeMarker 等。不過這些使用都不多了。如今流行先後端分離,後端不須要寫 HTML,只提供 RESTful 接口就能夠了。說到 RESTful,就不得不提另一個 Django 的衍生框架 DRF(Django REST Framework)。一步一步來,先學好了 Django,才能更好理解 DRF。
暫時不作介紹。
本文以 Web 後臺爲例,講解了從 model,到 ORM,到數據操做,到 URL 映射,到 views 回調函數的編寫鏈路。實際操做會複雜得多。之前學其餘框架有點懵,寫這篇文章,卻是讓我明白了 MVC 這一套是這麼一回事。
參考資料: