django 基礎篇
基本工具
-
env虛擬機 - virtualenvwrapper-win
- 安裝:
pip install virtualenvwrapper-win
- 基本指令:
- 創建:
mkvirtualenv <虛擬機名稱>
- 列表:
workon
- 進入:
workon <虛擬機名稱>
- 刪除:
rmvirtualenv <虛擬機名稱>
-
python
-
django
- 版本: 3.1 官方文檔
- 安裝:
pip install django==3.1
基本概念
- Model: 與資料庫欄位對映
- Template: 可於一般HTML內加入for、if等等判斷
- View: 邏輯編寫
專案創建
-
django-admin startproject <專案名稱>
-
python manage.py runserve
開啟本地伺服器,預設 8000 port
目錄結構
| manage.py
\---djangoAPI
asgi.py
settings.py
urls.py
wsgi.py
__init__.py
-
manage.py
: django命令包 參考
-
asgi.py
: ASGI兼容的Web服務器上的入口
-
settings.py
: 項目配置文件(DB、金鑰、引用apps...)
-
urls.py
: 主要路由器(各功能urls可於此集中)
-
wsgi.py
: WSGI兼容的Web服務器上的入口
-
__init__.py
: 一個空文件,告訴python這個目錄是一個python包 參考
創建功能模組
-
python manage.py startapp <功能名稱>
目錄結構
| manage.py
\---testSetting
| admin.py
| apps.py
| models.py
| tests.py
| views.py
| __init__.py
| urls.py(自行定義)
|
\---migrations
__init__.py
-
admin.py
: 管理員設置
-
migrations
: 資料庫創建紀錄
-
models.py
: 資料庫模型
-
views.py
: 功能邏輯
-
urls.py
: 該功能路由
基礎配置
路由
官方參考
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name = 'index'),
]
from django.urls import path, include
urlpatterns = [
path('testSetting/', include('testSetting.urls'))
]
- 於網址列輸入時,須以前綴表示EX: 127.0.0.0.1/testSetting/,如此一來在擁有很多個app時,如果有相同的views.index就能夠區分
DB
多DB配置官方參考
# 於setting.py中配置
# Database 路由連線設置
DATABASES = {
# 預設sqlite
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
# MSSQL連線配置
'testSetting': {
'ENGINE': 'sql_server.pyodbc',
'NAME': '<DB名稱>',
'USER': '<使用者>',
'PASSWORD': '<密碼>',
'HOST': '<IP>',
'PORT': '<port>',
'OPTIONS': {
'driver':'SQL Server Native Client 11.0',
'MARS_Connection': True,
}
}
}
# Database 路由
# database_router.DatabaseAppsRouter 需自行新增,可參考官方配置
DATABASE_ROUTERS = ['<projectName>.database_router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {
'testSetting': 'testSetting'
}
model 範例
# 這是一個最基本的範例
class test(models.Model): # 繼承models
testTest = models.CharField(max_length=5) # 對應資料表欄位
class Meta:
managed = False
app_label = 'testSetting' # DB路由的名稱
db_table = "test" # 資料表名稱
- Meta.managed = False 代表進行makemigration動作時,不進行遷移,這在已經存在的資料表非常好用
DB事務所
-
當進行一連串的新增、修改資料時,常常希望全部成功在一次更新。
例如銀行交易,A轉帳給B,需要A扣款與B入帳同時成功,如果A扣款成功,但B帳號凍結等等,則A的錢就不見了,這就是我們需要解決的問題。
# 功能實現 - 使用裝飾器
from django.db import transaction # 載入回滾工具
@transaction.atomic(using="DBName")
def atomicTest():
# 設定回滾位置,如果已下功能有失敗的部份,就會回到這個儲存點
sid = transaction.savepoint(using="DBName")
try:
# 此處執行修改、新增DB...
# 因為使用了atomic修飾詞,所以DB不會自動提交commit(即不會修正、新增...)
# 送出事務commit(此處送出,才算真的成功)
transaction.savepoint_commit(sid, using="DBName")
except ValueError as e:
# 自定義錯誤,將狀態回滾到sid(儲存點)
transaction.savepoint_rollback(sid, using="DBName")
except Exception as e:
# 未知錯誤,將狀態回滾到sid(儲存點)
transaction.savepoint_rollback(sid, using="DBName")