iT邦幫忙

2021 iThome 鐵人賽

DAY 5
1
AI & Data

觀賞魚辨識的YOLO全餐系列 第 5

Django + MariaDB 在 Amazon Linux 2-Day 05

Django + MariaDB 在 Amazon Linux 2-Day 05

今天的目的是要讓 Django Web 應用程式可以讀取 MariaDB 的資料,在前一篇我們新增了一個專案為 fishsite,這個專案下的 fishsite 子文件夾是整個網站的進入點,下圖有文件夾目錄的內容:

  • __init__.py: 是一個空文件,指示 Python 將此目錄視為 Python 套件。
  • __pycache__文件夾:當 .py 檔案第一次被匯入時,它會被直譯器彙編為位元組程式碼,並將位元組碼寫入同名的.pyc檔案中,可以簡單的看成是匯編後的文件,後續請求可以直接讀取這一部分代碼加專案名稱相同,並且加快執行速度。
  • settings.py: 包含所有的網站設置。這是可以註冊所有創建的應用的地方,也是靜態文件,數據庫配置的地方,等等。
  • urls.py: 定義了網站 url 到 view 的映射。雖然這裡可以包含所有的 url,但是更常見的做法是把應用相關的url包含在相關應用中,你可以在接下來的教程裡看到。
  • wsgi.py: 幫助 Django 應用和網絡服務器間的通訊。你可以把這個當作模板。
  • manage.py: 可以創建應用(App),資料庫通訊,啟動網絡服務器等。

https://ithelp.ithome.com.tw/upload/images/20210905/20129510KfjIdCbt5a.png
圖 1、Django 專案的檔案結構

Django 的一個專案下可以存在很多個應用(App),而當新增一個專案後會建立一個預設的應用,而這個預設的應用名稱會跟專案名稱相同。接下來的工作是

  • 安裝 Python 的 MariaDB 套件
  • 設定 settings.py 以連接資料庫
  • 設定 urls.py 定義網站 url 到畫面 (view)的對應
  • 新增 view.py 讀取資料庫並回傳結果

安裝 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', #當數據在插入時被截斷時,該選項會將警告升級為錯誤。
        }

https://ithelp.ithome.com.tw/upload/images/20210905/20129510TdfmZJFqoI.png
圖 2、在 settings.py 中資料庫連線設定

完成資料庫設定後,可以再運行一下啟動 Django Web 伺服器的指令,以確保設定的參數是正確的,以及跟有的套件都已經完備,下圖就是將資料庫的使用者名稱設定為 fishuser1 ,而導致存取拒絕的錯誤訊息。可以按下 CTRL+C 中斷執行 Django Web 伺服器的指令後,再進行修改。

python3 manage.py runserver 0.0.0.0:8000

https://ithelp.ithome.com.tw/upload/images/20210905/201295102qsK44lgT4.png
圖 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),

https://ithelp.ithome.com.tw/upload/images/20210905/20129510KMUpjUMwaZ.png
圖 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 筆資料表中的資料,可以發現會是以編碼的方式呈現,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20210905/201295107JrjhLbVQE.png
圖 5、透過瀏覽器呼叫 Django 的方法

下圖是後端伺服器的回應狀況,可以看到前端呼叫 imgUpload 的 HTTP 請求(request),以及成功的 200 代碼回應 (response)

https://ithelp.ithome.com.tw/upload/images/20210905/20129510RdQKVWBZi7.png

參考資料


上一篇
安裝 Django 在 Amazon Linux 2-Day 04
下一篇
Django + MariaDB + RESTful API + ARC-Day 06
系列文
觀賞魚辨識的YOLO全餐38

尚未有邦友留言

立即登入留言