Python的WEB架構有Django、Tornado、Flask 等多種,Django相較與其他WEB架構其優勢為:大而全,架構本身內建了ORM、模型綁定、模闆引擎、緩存、Session等諸多功能。
本文将以下方面帶大家全面了解Django架構,本章使用的版本為1.11.
- 流程
- 基本配置
- 路由系統
- 視圖view
- 模闆
- Model
- Form
- 分頁
- Cookie
- Seesion
- admin
一、 Django流程介紹
Django架構--路由配置設定系統1、Django的路由配置設定系統2、在用戶端通過url中的 path向後端傳參數 3、路由分發4、路由别名(應用站點權限管理)

MVC是衆所周知的模式,即:将應用程式分解成三個組成部分:model(模型),view(視圖),和 controller(控制 器)。其中:
M——管理應用程式的狀态(通常存儲到資料庫中),并限制改變狀态的行為(或者叫做“業務規則”)。
C——接受外部使用者的操作,根據操作通路模型擷取資料,并調用“視圖”顯示這些資料。控制器是将“模型”和“視圖”隔離,并成為二者之間的聯系紐帶。
V——負責把資料格式化後呈現給使用者。
Django也是一個MVC架構。但是在Django中,控制器接受使用者輸入的部分由架構自行處理,是以 Django 裡更關注的是模型(Model)、模闆(Template)和視圖(Views),稱為 MTV模式:
M 代表模型(Model),即資料存取層。 該層處理與資料相關的所有事務: 如何存取、如何驗證有效性、包含哪些行為以及資料之間的關系等。
T 代表模闆(Template),即表現層。 該層處理與表現相關的決定: 如何在頁面或其他類型文檔中進行顯示。
V 代表視圖(View),即業務邏輯層。 該層包含存取模型及調取恰當模闆的相關邏輯。 你可以把它看作模型與模闆之間的橋梁。
二、 Django 基本配置
1. 建立django程式
- 終端指令:django-admin startproject sitename (在目前目錄下建立一個Django程式)
- IDE建立Django程式時,本質上都是自動執行上述指令
其他常用指令:
python manage.py runserver ip:port (啟動伺服器,預設ip和端口為http://127.0.0.1:8000/)
python manage.py startapp appname (建立 app)
python manage.py makemigrations (顯示并記錄所有資料的改動)
python manage.py migrate (将改動更新到資料庫)
python manage.py createsuperuser (建立超級管理者)
python manage.py shell (指令行)
python manage.py (檢視指令清單)
2. 程式目錄
Django大緻工作流程
1、用戶端發送請求(get/post)經過web伺服器、Django中間件、 到達路由配置設定系統
2、路由配置設定系統根據提取 request中攜帶的的url路徑(path)與視圖函數映射關系清單中,比對到1個視圖函數,foo(request)執行;
3、視圖函數 使用原生SQL或者ORM去資料庫拿到資料,在服務端進行渲染(模闆+資料渲染)
4、視圖函數return一個 response對象 傳回用戶端
3. 配置檔案
a、資料庫
支援SQLite 3(預設)、PostgreSQL 、MySQL、Oracle資料庫的操作
# 預設是SQLit 3 的配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# MySQL的配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'dbname', #注意這裡的資料庫應該以utf-8編碼
'USER': 'xxx',
'PASSWORD': 'xxx',
'HOST': '',
'PORT': '',
}
}
# 對于python3的使用者們還需要再加一步操作
# 由于Django内部連接配接MySQL時使用的是MySQLdb子產品,而python3中還無此子產品,是以需要使用pymysql來代替
# 如下設定放置的與project同名的配置的 __init__.py檔案中
import pymysql
pymysql.install_as_MySQLdb()
# PostgreSQL配置
DATABASES = {
'default': {
'NAME': 'app_data',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'XXX',
'PASSWORD': 'XXX'
}
# Oracle配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'xe',
'USER': 'a_user',
'PASSWORD': 'a_password',
'HOST': '',
'PORT': '',
}
}
資料庫配置資訊
Django架構對于開發者而言高度透明化,對于不同資料庫的具體使用方法是一緻的,改變資料庫類型隻需要變動上述配置即可。
想要了解更多請戳這裡
b、靜态檔案添加
# 首先在項目根目錄下建立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>
三、 Django 路由系統
Django路由配置設定系統簡介
Django project目錄中的urls.py檔案中, 以Python [ ( ) ]的資料類型記錄了可以通路到該站點的url 和 視圖函數一一對應關系表,當request請求到達路由系統,Django通過request中攜帶的path 周遊這個關系表,比對到對應的視圖函數,break;(是以1個 url 隻能從路由關系表中自上而下比對到1個視圖函數)
1、Django的路由配置設定系統
1個URL對應1個視圖函數
from django.conf.urls import url
from django.contrib import admin
from APP import view
urlpatterns = [
url(r'^modal/',view.modal), url(r'^域名',對應的處理函數) 注意不要忘了寫 ^ 表示正則比對以。。開頭的URL
url(r'^modal_add/',view.modal_add),
url(r'^modal_del/',view.modal_del),
url(r'^modal_edit/',view.modal_edit),
]
2、在用戶端通過url中的 path向後端傳參數
在前端我們不僅可以通過get請求攜帶參數的方式向server端傳資料; https://i.cnblogs.com/%EF%BC%9Fid=1&name=alex
Django也允許通過,path路徑的方式向server端傳值;
注意事項:按位置,和按關鍵字路由系統隻能用1種,不能混合使用;
1)、path正則無名分組比對《---------》視圖函數按位置傳參
from django.conf.urls import url,include
from django.contrib import admin
from app1 import views
urlpatterns = [
url(r'^index/(\w+)/(\w+)/',views.index2), #醬紫的話用戶端 輸入:http://127.0.0.1:8000/index/a/b/也可以通路到該站點
url(r'^',views.error)
]
urlpatterns = [
url(r'^/',index), #視圖函數 index(request)
url(r'^(\d{4})/\d{2}/$',timeer1), #視圖函數 timeer1(request,實參1) 正則增加了分組,視圖函數會增加一個參數;
url(r'^(\d{4})/(\d{2)/$',timeer2) #視圖函數 timeer2(request,實參1,實參2) 視圖函數需要2個形參接收;
# url(r'^(?P<year>\d{4})/(?P<month>\d{2})/$',timeer),
在路由系統定義了 幾個正則分組(),在視圖函數對應幾個實參接收;
def timeer2(request,a1,a2):
print(a1,a2) #列印參數a1,a2 就是 2個正規表達式比對到的結果
return Httprespose('ok')
#注意如果按位置傳參的動态路由系統,必須在視圖函數添加對應的參數接收!
2)、path正則有名分組比對《---------》視圖函數按關鍵字傳參
按位置傳參形參或實參錯位會導緻資料錯亂,是以Django路由分發系統還可以以命名分組的形式比對URL給視圖函數按關鍵字傳參;
from django.conf.urls import url,include
from django.contrib import admin
from app1 import views
urlpatterns = [
url(r'^index/(P<n1>\w+)/(P<n2>\w+)/',views.index,name="zhanggen"),
url(r'^(?P<year>\d{4})/(?P<month>\d{2})/$',timeer),
url(r'^',views.error), ] #注意如果在路由系統正則内部定義了關鍵字n1,n2,視圖函數接收參數也必須是 n1,n2;
urlpatterns = [
# url(r'^/',index), #index(request)
# url(r'^(\d{4})/\d{2}/$',timeer), #timeer(request,2014) 正則增加了分組,視圖函數會增加一個參數;
# url(r'^(\d{4})/(\d{2)/$',timeer1) , #timeer(request,2014,12) 視圖函數需要兩個形參接收
url(r'^(?P<year>\d{4})/$(?P<month>\d{2})',timeer2) #timeer(request,year=2017,month=6) 正則設定了有名分組,視圖函數使用關鍵字傳參
]
在視圖函數定義2個關鍵字參數, 接收 2個正規表達式比對到的字尾;
def index(request,n1,n2):
print(n1,n2) #注意必須和 路由系統中的一緻
return HttpResponse('OK')
3)、URL path傳值應用
有了動态路由就 可以不用在 url?nid=8這樣傳值了!
PS:
終止符:^edit$ 可以精确限制比對URL的字尾内容
僞靜态:url(r'^edit/(\w+).html$', views.edit) 裝作成靜态網站的url可以 提高 SEO高權重 百度排名靠前
url(r'^student_del/(.*).html/',views.student_del),
<a href="/student_del/{{row.id}}.html/">删除</a></td>
def student_del(request,args1):
return HttpResponse('nihao')
3、路由分發
1個Django 項目裡面有多個APP目錄大家共有一個 url容易造成混淆,于是路由分發讓每個APP的擁有了自己單獨的url;
from django.conf.urls import url,include
from django.contrib import admin
from app1 import views
urlpatterns = [
url(r'^app1/',include('app1.urls')),
url(r'^app2/',include('app2.urls')), #注意include的是字元串形式的 檔案路徑;
url(r'^',views.error),
]
醬紫就可以在每個 Django目錄下面寫自己的 URL了
4、路由别名(應用站點權限管理)
1)、什麼是路由别名?
給Django路由分發系統 URL--視圖函數對應關系命個名,
然後在模闆中{% url "zhanggen" i i1%}反生成 通路該站點URL,
或者在視圖函數中reverse()反向生産目前通路URL;
2)、作用
保證前後端資料一緻性,後端修改了比對URL,不用在前段更改;
from django.conf.urls import url,include
from django.contrib import admin
from app1 import views
urlpatterns = [
url(r'^index/(?P<n1>\w+)/(?P<n2>\w+)/',views.index,name="alex"), 給這個URL起别名 alex
url(r'^',views.error),
]
在視圖函數使用 reverse("别名", args=(1, 2)) 反生 位置參數動态路由的 别名
def index(request,n1,n2):
print(reverse("zhanggen", args=(1, 2)))
return render(request,'index.html',{'i':1,'i1':2})
在視圖函數使用 reverse("别名",kwargs={"關鍵字參數":1,"關鍵字參數":2 }反生 關鍵字參數動态路由的 别名
def index(request,n1,n2):
print(reverse("zhanggen",kwargs={"n1":1,"n2":2 }))
return render(request,'index.html',{'i':1,'i1':2})
在模闆中反生 URL
注意 在視圖函數中 return render(request,'index.html',{'i':1,'i1':2})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>{{ i }}</p>
<p>{% url "zhanggen" i i1%}</p>
</body>
</html>
轉載于:https://www.cnblogs.com/wu-chao/p/8285022.html