iT邦幫忙

1

Django 基礎篇

  • 分享至 

  • xImage
  •  

django 基礎篇

基本工具

  • env虛擬機 - virtualenvwrapper-win

    • 安裝: pip install virtualenvwrapper-win
    • 基本指令:
      • 創建: mkvirtualenv <虛擬機名稱>
      • 列表: workon
      • 進入: workon <虛擬機名稱>
      • 刪除: rmvirtualenv <虛擬機名稱>
  • python

  • django

基本概念

  • Model: 與資料庫欄位對映
  • Template: 可於一般HTML內加入for、if等等判斷
  • View: 邏輯編寫
    https://ithelp.ithome.com.tw/upload/images/20201201/20132538WUnMw26Z7r.jpg

專案創建

  • 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: 該功能路由

基礎配置

路由

官方參考

  • 於各功能模組中新增 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")

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言