今天的目的是要讓 Django Web 應用程式可以讀取 MariaDB 的資料,在前一篇我們新增了一個專案為 fishsite,這個專案下的 fishsite 子文件夾是整個網站的進入點,下圖有文件夾目錄的內容:
圖 1、Django 專案的檔案結構
Django 的一個專案下可以存在很多個應用(App),而當新增一個專案後會建立一個預設的應用,而這個預設的應用名稱會跟專案名稱相同。接下來的工作是
安裝 Python 的 MariaDB 套件
在 Amazon Linux 2 內安裝 mariadb-devel,接著在透過 pip3 安裝 Python 所需要的套件 mysqlclient
sudo yum install mariadb-devel
pip3 install mysqlclient
設定 settings.py 以連接資料庫
在上一篇 安裝資料庫 MariaDB 在 Amazon Linux 2-Day 03 中已經設定好資料庫,所以需要在 settings.py 中建立資料庫的連線設定
'default': {
'ENGINE': 'django.db.backends.mysql', # 資料庫引擎
'NAME': 'fishdb', # 先前建立的資料庫
'USER': 'fishuser', # 資料庫使用者
'PASSWORD': 'xxxxxx', # 密碼,左邊的密碼是去敏用的,請自行設定
'HOST': 'localhost', # 資料庫所在主機
'PORT': '3306', # 資料庫埠號
'OPTIONS': {
'sql_mode' : 'STRICT_TRANS_TABLES', #當數據在插入時被截斷時,該選項會將警告升級為錯誤。
}
圖 2、在 settings.py 中資料庫連線設定
完成資料庫設定後,可以再運行一下啟動 Django Web 伺服器的指令,以確保設定的參數是正確的,以及跟有的套件都已經完備,下圖就是將資料庫的使用者名稱設定為 fishuser1 ,而導致存取拒絕的錯誤訊息。可以按下 CTRL+C 中斷執行 Django Web 伺服器的指令後,再進行修改。
python3 manage.py runserver 0.0.0.0:8000
圖 3、因資料庫設定錯誤,導致啟動 Django Web 伺服器失敗
設定 urls.py
接著打開 urls.py 來設定 URI 到畫面 (view)的對應,我們的專案很簡單,只有一個上傳圖片的需求,所以設定 URI 為 imgUpolad 對應到 view 這個文件中 hello 的方法,在最後一行加上下述語法,結果如下圖所示。
# 從目前目錄中(.)匯入 view.py 這個檔案
from . import view
# 指定當使用者讀取 imgUpolad 這個URI時會對應 (route) 到 view 這個檔案中的 hello 這個方法
path('imgUpload/', view.hello),
圖 4、新增 URI 與畫面的對應關係
新增 view.py
在 urls.py 這個檔案相同的目錄下,新增一個檔案 view.py,內容如下,主要功能為讀取資料庫內容並回傳結果。我們所採用的方法是直接用原始 SQL 語法讀取資料表,而非用 Django 使用物件關係映射器(ORM),將 Django 代碼中的模型 (model) 定義,會對應到底層的資料庫使用的資料結構。主要是因為我們只有一個的資料表,所以直接用 Django 所實作的 connection 來傳入所需的 SQL 語法。
型態簡單
view.py
from django.http import JsonResponse
from django.db import transaction
from django.db import connection
def hello(request):
with connection.cursor() as cursor:
cursor.execute("select fishName,LatinName from fishInfoTbl")
#row = cursor.fetchone()
row = dictfetchall(cursor)
return JsonResponse(row, safe=False)
def dictfetchall(cursor):
# "Return all rows from a cursor as a dict"
columns = [col[0] for col in cursor.description]
return [
dict(zip(columns, row))
for row in cursor.fetchall()
]
在瀏覽器裡輸入 http:[EC2_IPv4]:8000/imgUpload/,[EC2_IPv4]指的是EC2的公有 IPv4 地址。就會出現 5 筆資料表中的資料,可以發現會是以編碼的方式呈現,如下圖所示。
圖 5、透過瀏覽器呼叫 Django 的方法
下圖是後端伺服器的回應狀況,可以看到前端呼叫 imgUpload 的 HTTP 請求(request),以及成功的 200 代碼回應 (response)
參考資料