- 一個完整的軟件結(jié)構(gòu)囤捻,包含了和用戶交互的軟件界面食听、進(jìn)行數(shù)據(jù)處理的后端程序籍救、實(shí)現(xiàn)數(shù)據(jù)存儲的數(shù)據(jù)庫三個部分习绢;
通過前端交互界面展示數(shù)據(jù)或者獲取用戶輸入的數(shù)據(jù),將數(shù)據(jù)傳遞給后端處理程序[傳遞請求參數(shù)]蝙昙;后端處理程序處理完數(shù)據(jù)闪萄,將數(shù)據(jù)永久保存[持久化]到數(shù)據(jù)庫中。
通過后端處理程序可以從數(shù)據(jù)庫中讀取數(shù)據(jù)奇颠,經(jīng)過處理之后傳遞給前端網(wǎng)頁進(jìn)行展示
2. Django創(chuàng)建的web項(xiàng)目败去,文件結(jié)構(gòu) & 項(xiàng)目結(jié)構(gòu)
文件結(jié)構(gòu):每個文件的意義[文件的作用和所處的位置]
|-- mysite/ # 項(xiàng)目根目錄
|-- mysite/ # 根項(xiàng)目 只能出現(xiàn)1個,在創(chuàng)建項(xiàng)目時同時創(chuàng)建
|-- settings.py # 項(xiàng)目信息配置烈拒,如項(xiàng)目的語言
|-- urls.py # 項(xiàng)目主路由配置
|-- myblog/ # 子應(yīng)用模塊圆裕,可以出現(xiàn)0~n個
|-- app.py # 子應(yīng)用模塊的信息描述
|-- models.py # 子應(yīng)用模塊中的模型
|-- urls.py # 子應(yīng)用模塊中的自路由,需要包含到主路由中
|-- views.py # 子應(yīng)用視圖處理模塊荆几,通過路由來調(diào)用函數(shù)
|-- models_manager.py # 管理器模塊[可選]
|-- manage.py # 命令模塊
項(xiàng)目結(jié)構(gòu):項(xiàng)目組織形式[架構(gòu)方式]~通過根項(xiàng)目模塊吓妆,管理所有的子項(xiàng)目模塊
|-- 根項(xiàng)目
|-- 子模塊項(xiàng)目[單獨(dú)的項(xiàng)目]<INSTALLED_APPS | urls -> 接入跟項(xiàng)目>
|-- 子模塊項(xiàng)目[單獨(dú)的項(xiàng)目]
|-- ..
功能的擴(kuò)展性和可伸縮性及可維護(hù)性非常的強(qiáng)大!
擴(kuò)展性:Django可以在盡量少的修改源代碼的基礎(chǔ)上吨铸,增加強(qiáng)大的新功能[OCP]
可伸縮性:Django的項(xiàng)目功能行拢,可以在互相不影響的情況下,動態(tài)的增加或者減少不同的項(xiàng)目功能
可維護(hù)性:不同的項(xiàng)目功能分布在不同的子模塊應(yīng)用中焊傅,如果某個功能出現(xiàn)巨大的問題剂陡,只需要停用這個模塊項(xiàng)目即可,不影響其他的模塊項(xiàng)目的正常功能
3. Django的設(shè)計結(jié)構(gòu)——MVT處理模式
MVT處理模式一種編程思想狐胎,由數(shù)據(jù)模型Model鸭栖,視圖模塊view和模板系統(tǒng)Template組成;并且添加了路由url的功能實(shí)現(xiàn)請求分發(fā)操作握巢,完成實(shí)際流程的處理
一個完成的流程就是客戶端請求發(fā)送之后晕鹊,通過路由Urls分配請求到具體的視圖處理函數(shù)views中進(jìn)行操作,調(diào)用普通處理函數(shù)處理具體的數(shù)據(jù)模型models暴浦,將數(shù)據(jù)增加/修改/刪除/查詢到數(shù)據(jù)庫的操作溅话,最后普通處理函數(shù)返回處理結(jié)果給視圖處理函數(shù)views,view中將數(shù)據(jù)填充到模板template中返回給客戶端瀏覽器進(jìn)行展示歌焦。
聽說過MVC處理模式嗎飞几?聽說過MVP處理模式嗎?聽說過MVT處理模式嗎独撇?
MVC是最基本的一種編程思想屑墨,主要解決的是一個問題的處理流程躁锁,通過三個組成部分[封裝數(shù)據(jù)的模型model,進(jìn)行數(shù)據(jù)展示和采集的視圖view卵史,以及進(jìn)行請求分發(fā)的控制器controller]完成問題處理流程的一種操作模式战转;在這種操作模式中,控制器完成視圖和模型之間數(shù)據(jù)自動交互的橋梁以躯,視圖發(fā)起的請求會由控制器進(jìn)行轉(zhuǎn)發(fā)調(diào)用后端程序的處理函數(shù)進(jìn)行數(shù)據(jù)model的處理槐秧,處理完成之后返回結(jié)果給控制器,控制器根據(jù)處理的結(jié)果返回不同的視圖頁面進(jìn)行展示忧设;在現(xiàn)行的MVC處理模式中刁标,發(fā)展過程中將視圖和模型的數(shù)據(jù)進(jìn)行了雙向綁定,視圖中的數(shù)據(jù)發(fā)生變化见转,模型中的數(shù)據(jù)會自動變化命雀,同樣的模型中的數(shù)據(jù)一旦發(fā)生改變,視圖中的數(shù)據(jù)同時變化斩箫。
MVP處理模式吏砂,是在MVC處理模式上,為了區(qū)分?jǐn)?shù)據(jù)的綁定方式而杜撰的一個處理模式
MVP處理模式~前后端數(shù)據(jù)的交互乘客,必須通過主動交互才能發(fā)生改變狐血。
MVT處理模式,參考上圖
4. Django項(xiàng)目搭建過程
a. 創(chuàng)建項(xiàng)目[Django項(xiàng)目在創(chuàng)建時易核,會自動創(chuàng)建根項(xiàng)目匈织,是包含在根目錄中的]
>>> django-admin startproject <name>
>>> eg. django-admin startproject mysite
b. 創(chuàng)建子應(yīng)用模塊
mysite>>> django-admin startapp <model_name>
mysite>>>eg. django-admin startapp myblog
c. 注冊子應(yīng)用模塊給根項(xiàng)目
(1) 修改mysite/mysite/settings.py配置文件
..
INSTALLED_APPS = [
..
‘myblog’,
]
(2) 修改主路由文件mysite/mysite/urls.py
from django.conf.urls import url, include
urlpatterns = [
url(r”myblog/”, include(“myblog.urls”)),
..
]
d. 根項(xiàng)目的網(wǎng)頁視圖以及靜態(tài)文件處理[所有子應(yīng)用模塊公共的]
(1) 配置根網(wǎng)頁視圖文件夾,修改mysite/mysite/settings.py
..
TEMPLATES = {
..
DIRS: [“temp”] # mysite/temp/
..
}
(2) 配置根項(xiàng)目靜態(tài)文件路徑牡直,修改mysite/mysite/settings.py
添加新的配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR, “static”) # mysite/static/
]
e. 配置子應(yīng)用模塊的網(wǎng)頁模板以及靜態(tài)文件
子應(yīng)用模板的網(wǎng)頁模板和靜態(tài)文件不需要配置缀匕,而是Django內(nèi)置的加載器對象,自動在子應(yīng)用模塊中進(jìn)行查詢[網(wǎng)頁和靜態(tài)文件]
子應(yīng)用模塊網(wǎng)頁文件:在子應(yīng)用模塊中templates/文件夾下
子應(yīng)用模塊的靜態(tài)文件:在子應(yīng)用模塊中static/文件夾下
實(shí)際操作過程中碰逸,為了和根項(xiàng)目網(wǎng)頁和靜態(tài)文件做區(qū)分乡小,所以要進(jìn)行路徑隔離
eg:
mysite/myblog/templates/myblog/index.html
mysite/myblog/static/myblog/css/index.css
5. Django中的數(shù)據(jù)模型定義
數(shù)據(jù)模型:自定義的類型,可以創(chuàng)建對象饵史,用于封裝我們正在使用的數(shù)據(jù)满钟,可以方便的和數(shù)據(jù)庫進(jìn)行交互
a. 連接數(shù)據(jù)庫:mysite/mysite/settgins.py
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
‘detault’:{
‘ENGINE’: ‘django.db.backends.mysql’
‘NAME’: ‘db_name’
‘USER’: ‘root’
‘PASSWORD’: ‘’
}
}
b. 定義數(shù)據(jù)模型
from django.db import models
class MyObject(models.Model): # 自定義類型必須繼承Model類型
id = models.AutoField(..) # 類型的屬性,必須通過Django方法創(chuàng)建
c. 數(shù)據(jù)交互[數(shù)據(jù)和數(shù)據(jù)庫之間的增刪改查]
(1) 通過類型本身進(jìn)行操作
models.MyObject.objects.all()/filter()/..
m = MyObject()創(chuàng)建一個對象
m.save()/delete()/update()
(2) 通過管理器對象進(jìn)行操作
自定義管理器對象胳喷,繼承Django內(nèi)置的Manager類型
class MyObjectManager(models.Manager):
def create_obj(self, **kw):
pass
def delete_obj(self, **kw):
pass
def update_obj(self, **kw):
pass
..
6. 網(wǎng)頁前端和后端程序之間的交互
(1) 網(wǎng)頁前端發(fā)送數(shù)據(jù)給后端程序
前端網(wǎng)頁的數(shù)據(jù):用戶輸入(表單)湃番、超鏈接、URL地址直接訪問
前端->后端程序:數(shù)據(jù)的傳遞:請求參數(shù)
前端? 傳遞數(shù)據(jù) ? 后端程序
HTTP1.1標(biāo)注:8種傳遞方式
常見4種傳遞方式[GET/POST/PUT/DELETE]
項(xiàng)目中常用的2中傳遞方式[GET/POST]
擴(kuò)展:項(xiàng)目中吭露,還有一種特殊的GET傳遞方式:RESTful
? get傳遞
? post傳遞
? restful傳遞
RESTful傳遞的參數(shù)吠撮,包含在url路徑中
url路徑是通過路由進(jìn)行配置
參數(shù)需要通過路由進(jìn)行設(shè)置
url(r’^param/(?P<name>[a-z]+)/rest/$’, views.rest_test)
()表示這里需要一個參數(shù)
?要使用指定的語法
P:param,表示參數(shù)描述
<name>:表示接受的參數(shù)數(shù)據(jù)讲竿,會放在一個名稱為name的變量中
[a-z]+:表示這個參數(shù)只接受小寫的1個或者多個字符
def rest_test(request, name):
pass
(2) 后端程序傳遞數(shù)據(jù)到網(wǎng)頁進(jìn)行展示
模板語法:Templates
變量|程序結(jié)構(gòu)|過濾器|注釋
{{name}} | {% 標(biāo)簽 %}
變量[普通|對象|列表|字典|..] {{變量名稱}}
標(biāo)簽{% %}
程序結(jié)構(gòu) {%if%}..{%for%}..{%csrf_token%}..{%commend%}
{%block%}..{%load%}..{%url%}..{%static%}
過濾器{{變量 | 過濾器}}
注釋:{%comment%}{%endcomment%}
常規(guī)的網(wǎng)頁注釋纬向,不會影響變量數(shù)據(jù)的輸出