一、Django簡介
Django是用Python開發(fā)的一個免費開源的Web框架,可以用于快速搭建高性能,優(yōu)雅的網(wǎng)站!
初次發(fā)布于2005年7月,并于2008年發(fā)布了第一個正式版本1.0。
官方文檔: https://www.djangoproject.com/
二、Django特點
- 強(qiáng)大的數(shù)據(jù)庫功能: 擁有強(qiáng)大的數(shù)據(jù)庫操作接口(QuerySet API),如需要也能執(zhí)行原生SQL。
- 自帶強(qiáng)大的后臺: 幾行簡單的代碼就讓你的網(wǎng)站擁有一個強(qiáng)大的后臺,輕松管理內(nèi)容!
- 優(yōu)雅的網(wǎng)址: 用正則匹配網(wǎng)址,傳遞到對應(yīng)函數(shù),隨意定義,如你所想!
- 模板系統(tǒng): 強(qiáng)大,易擴(kuò)展的模板系統(tǒng),設(shè)計簡易,代碼,樣式分開設(shè)計,更容易管理。
(注:前后端分離時,也可以用Django開發(fā)API,完全不用模板系統(tǒng)。) - 緩存系統(tǒng),與Memcached, Redis等緩存系統(tǒng)聯(lián)用,更出色的表現(xiàn),更快的加載速度。
- 國際化,完全支持多語言應(yīng)用,允許你定義翻譯的字符,輕松翻譯成不同國家的語言。
三、MVC模式
MVC是一種軟件設(shè)計典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個部件中,在改進(jìn)和個性化定制界面及用戶交互的同時,不需要重新編寫業(yè)務(wù)邏輯。MVC被獨特的發(fā)展起來用于映射傳統(tǒng)的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結(jié)構(gòu)中。
- Model(模型)
應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯部分;
通常模型對象負(fù)責(zé)在數(shù)據(jù)庫中存取數(shù)據(jù);
- View(視圖)
應(yīng)用程序中處理數(shù)據(jù)顯示部分;
通常視圖是依據(jù)模型數(shù)據(jù)創(chuàng)建的;
- Controller(控制器)
應(yīng)用程序中處理用戶交互部分;
通常控制器負(fù)責(zé)從視圖中讀取數(shù)據(jù),控制用戶輸入,并向模型發(fā)送數(shù)據(jù);
優(yōu)點: 降低各個功能模塊之間的耦合性,方便變更,更容易重構(gòu)代碼,最大程度上實現(xiàn)代碼的重用。
四、MTV模式
本質(zhì)上MTV與MVC模式?jīng)]有什么區(qū)別,也是各組件之間為了保持松耦合關(guān)系,只是定義上有些不同。
- Model(模型)
負(fù)責(zé)業(yè)務(wù)對象與數(shù)據(jù)庫對象(ORM)
- Template(模板)
負(fù)責(zé)如何把頁面展示給用戶
- View(視圖)
負(fù)責(zé)業(yè)務(wù)邏輯,并在適當(dāng)?shù)臅r候調(diào)用Model和Template
Django還有一個url分發(fā)器,它的作用是將一個個URL的頁面請求分發(fā)給不同的view處理,view再調(diào)用相應(yīng)的Model和Template。
五、Django環(huán)境搭建
-
Django版本選擇
Django 1.5.x 支持 Python 2.6.5 Python 2.7, Python 3.2 和 3.3. Django 1.6.x 支持 Python 2.6.X, 2.7.X, 3.2.X 和 3.3.X Django 1.7.x 支持 Python 2.7, 3.2, 3.3, 和 3.4 (注意:Python 2.6 不支持了) Django 1.8.x 支持 Python 2.7, 3.2, 3.3, 3.4 和 3.5. (長期支持版本 LTS) Django 1.9.x 支持 Python 2.7, 3.4 和 3.5. 不支持 3.3 了 Django 1.10.x 支持 Python 2.7, 3.4 和 3.5 Django 1.11.x 支持 Python 2.7, 3.4, 3.5 和 3.6(長期支持版本 LTS) Django 2.0.x 支持 Python 3.4, 3.5 和 3.6 (注意,不再支持 Python 2)
-
pip安裝(如果有直接跳過)
- 下載get-pip.py文件(Linux, Mac OSX, Windows都可用) https://bootstrap.pypa.io/get-pip.py - 安裝(在終端中運行) $ python get-pip.py 備注: 當(dāng)Python2.x和Python3.x共存的時候要區(qū)分是哪個版本需要安裝;
pip更新(Linux或MacOS): pip install -U pip
pip更新(Windows): python -m pip install -U pip
-
安裝Django
- 安裝 $ pip install Django==1.11.4 - 驗證是否成功() 進(jìn)入到python環(huán)境(終端中輸入python) >>> import django >>> django.get_version() '1.11.4'
操作時,請切換到python3的虛擬環(huán)境中!
六、Django項目創(chuàng)建
- 新建Django項目:
$ django-admin startproject projectName
- 目錄層級說明:
manage.py 一個命令行工具,可以使我們多種方式對Django項目進(jìn)行交互
projectName/__init__.py 一個空文件,告訴python這個目錄被看做一個python包(有這個能稱之為包)
projectName/settings.py 項目的配置文件
projectName/urls.py 項目URL聲明(路由器)
projectName/wsgi.py 項目與WSGI兼容的Web服務(wù)器入口(網(wǎng)關(guān)接口,通常用在現(xiàn)線上環(huán)境部署)
- 項目的運行:
$ python manage.py runserver
$ python manage.py runserver 0.0.0.0:8000
$ python manage.py runserver 0:8000 # 0.0.0.0簡寫方式
- settings.py項目配置文件
BASE_DIR 項目根目錄
SECRET_KEY 秘鑰
DEBUG 調(diào)試的開啟
ALLOWED_HOSTS 允許訪問的主機(jī)
INSTALLED_APPS 安裝的應(yīng)用
MIDDLEWARE 中間件
ROOT_URLCONF 站點url配置
TEMPLATES 模板
WSGI_APPLICATION wsig應(yīng)用
DATABASES 數(shù)據(jù)庫
AUTH_PASSWORD_VALIDATORS 密碼驗證規(guī)則
LANGUAGE_CODE 語言(中文: zh-hans)
TIME_ZONE 時區(qū) (中國時區(qū): Asia/Shanghai)
- 站點管理的漢化版(在settings.py中替換以下內(nèi)容即可)
LANGUAGE_CODE = 'en-us' 替換 LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'UTC' 替換 TIME_ZONE = 'Asia/Shanghai'
備注: Linux或Mac下,直接在終端中操作;而在Windows中在cmd中操作(開始 -> 搜索cmd)
Linux中輸入tree可以看到具體的目錄結(jié)構(gòu)(樹狀)
七、創(chuàng)建應(yīng)用
要先進(jìn)入項目目錄下,cd projectName
然后執(zhí)行下面的命令:
$ python3 manage.py startapp appName
項目文件說明:
admin.py 站點配置
models.py 模型
views.py 視圖
其實一個項目中可以創(chuàng)建多個應(yīng)用;
sqlite是輕量級小型數(shù)據(jù)庫(嵌入級數(shù)據(jù)庫),在Django中默認(rèn)使用的就是sqlite【一般在手機(jī)APP中都會使用到這個sqlite】
八、激活應(yīng)用
在settings.py
文件中,將appName
應(yīng)用加入到INSTALL_APPS
選項中.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'appName' # 添加自己的應(yīng)用
]
請求流程: 用戶請求 -> urls -> views -> templates -> 用戶響應(yīng) 【從后往前寫】
九、設(shè)計表結(jié)構(gòu)
-
班級表
表名: grades 字段: 序號id、班級名gname、開班時間gdate、男生數(shù)量gboynum、女生數(shù)量ggirlnum、是否刪除isdel
-
學(xué)生表
表名: students 字段: 序號id、學(xué)生名sname、性別ssex、年齡sage、班級sclass、 簡介sbrief、是否刪除isdel
十、配置數(shù)據(jù)庫
-
在
__init__
中添加兩行代碼 (確保安裝mysql,另外需要pip3 install pymysql)import pymysql pymysql.install_as_MySQLdb()
python3安裝的是PxMysql (和python2是不一樣的)
-
在
settings.py
中修改默認(rèn)數(shù)據(jù)庫DATABASES = { 'default': { # 修改為mysql 'ENGINE': 'django.db.backends.mysql', # 必須先創(chuàng)建有對應(yīng)的數(shù)據(jù)庫 'NAME': 'zyz', # 用戶名 'USER': 'root', # 密碼 'PASSWORD': '123456’, # 主機(jī) 'HOST': '127.0.0.1', # 端口號 'POST': '3306’ } }
Django默認(rèn)使用SQLine數(shù)據(jù)庫
十一、定義模型
-
班級表
# 班級表Grades class Grades(models.Model): # 對應(yīng)字段,以及字段類型 # id = models.IntegerField() gname = models.CharField(max_length=30) gdate = models.DateField() gboynum = models.IntegerField() ggirlnum = models.IntegerField() isdel = models.BooleanField(default=False)
需要引入
from django.db import models
。模型類要繼承models.Model
類。 -
學(xué)生表
# 學(xué)生表Students class Students(models.Model): # 在沒有添加主鍵時,它會在生成時自動添加主鍵 # id = models.IntegerField() sname = models.CharField(max_length=30) ssex = models.CharField(max_length=10) sage = models.IntegerField() sbrief = models.CharField(max_length=50) isdel = models.BooleanField(default=False) # 關(guān)聯(lián)外鍵(學(xué)生都會有一個班級) sclass = models.ForeignKey('Grades')
十二、數(shù)據(jù)庫中生成對應(yīng)表單
-
生成遷移文件
$ python manage.py makemigrations 備注: 在migrations目錄中生成一個遷移文件,此時數(shù)據(jù)庫中還沒生成表單
-
執(zhí)行遷移
$ python manage.py migrate 備注: 相當(dāng)于執(zhí)行了MySQL語句創(chuàng)建了表單(appname_students、appname_grades)
就算是沒有創(chuàng)建模型,也是要執(zhí)行遷移,因為除了自己系統(tǒng)需要在數(shù)據(jù)庫中生成對應(yīng)的表單!
十三、數(shù)據(jù)庫表單操作
- 查詢所有數(shù)據(jù)
Grades.objects.all()
備注: 在模型類中,其實會有一個隱藏屬性objects
備注: 添加數(shù)據(jù)本質(zhì),就是創(chuàng)建一個模型類的對象實例
- 添加數(shù)據(jù)
# 創(chuàng)建對象
stu1 = Students()
# 對象屬性
stu1.sname = '哈哈'
# 保存
stu.save()
- 查看數(shù)據(jù)(查看對象)
Grades.objects.get(pk=1)
Grades.objects.get(pk=2)
- 修改數(shù)據(jù)(修改對象屬性)
g = Grades.objects.get(pk=1)
g.gboynum = 70
g.save()
- 刪除數(shù)據(jù)
g.delete() # 物理刪除,即數(shù)據(jù)庫中表單數(shù)據(jù)被刪除
- 關(guān)聯(lián)對象
# 獲取到班級對象 (pk即是id那個字段)
grade = Grades.objects.get(pk=2)
# 添加學(xué)生對象
stu2 = Students()
stu2.sname = '李花花'
stu2.ssex = '女'
stu2.sage = 18
stu2.sbrief = '你負(fù)責(zé)賺錢養(yǎng)家,我負(fù)責(zé)貌美如花.'
stu2.sclass = grade
stu2.save()
- 獲取關(guān)聯(lián)對象
語法:
對象.關(guān)聯(lián)的類名小寫_set.all()
例如:
grade.students_set.all()
備注: 在班級中,想要獲取某個班級中關(guān)聯(lián)的學(xué)生信息
需求: python04班級存在, 如何快速關(guān)聯(lián)上快速創(chuàng)建對應(yīng)學(xué)生? # 可以直接通過以下方法創(chuàng)建,并且不需要調(diào)用保存 (但班級是python04而不是python05)
# 其實就是直接grade和創(chuàng)建的學(xué)生對象關(guān)聯(lián)起來了
stu3 = grade.students_set.create(sname='王八',ssex='男',sage=20,sbrief='哈哈,咬我啊..')
十四、視圖
- 方式一
def hello(request):
return HttpResponse('hello')
- 方式二
def hello(request):
return render(request, 'hello.html')
- 模板渲染(帶參數(shù))
def student(request):
students = Student.objects.all()
return render(request, 'students.html', context={'student_data': students})
十五、啟動服務(wù)器
語法:
python3 manage.py runserver ip:port
例如:
python3 manage.py runserver
備注:
IP可以不寫,代表即是本機(jī)IP
端口號默認(rèn)是8000
啟動成功后,在瀏覽器可以看到”It worked!”
說明:
這是一個純python寫的輕量級web服務(wù)器,僅僅在開發(fā)測試階段中使用
作者:西門奄
鏈接:http://www.lxweimin.com/u/77035eb804c3
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。