Yuanlin Lin

Blog

菜雞也看得懂的 Django REST Framework 串接 MongoDB 教學

Yuanlin Lin 林沅霖

2020-09-07

這篇文章是《菜雞也看得懂的全端專案開發實作教學》系列中的其中一篇文章。跟隨本系列,就算是毫無開發經驗的菜雞也能獨立開發全端專案!

本系列已停更:這篇文章是 2020 年 9 月 7 日發表於 Medium 的文章,距離這個部落格架設的日子已經經過快 2 年啦!目前已經不打算繼續更新這個系列,因為我現在主要使用 Go 語言開發後端而不是 Python。

在上一篇教學中,我們已經使用 Django 的 startproject 指令來建立了一個全新的 Django 專案,並且安裝了 Django Rest Framework 這個套件,寫出了幾個很基礎並且沒什麼實質功能的 API。在這篇文章,我們將把我們的 Django 專案串接至 MongoDB 資料庫。

為什麼後端要連結到資料庫?

有了資料庫以後,我們可以在裡面記錄當前開發的這個系統需要儲存的一些資料。舉個例子,我們今天無論開發的是怎麼樣的服務,有很大的概率都會需要一個會員系統對吧!為了實現出這個會員系統,我們勢必是需要一個資料庫來紀錄我們所有會員的會員資料。

Django 內建支援以下幾種資料庫: PostgreSQL、 MariaDB 、MySQL 、Oracle 、SQLite。可以看到這些資料庫都是屬於 SQL 類型的。那麼如果我們想要使用屬於 NoSQL 類型的 MongoDB 資料庫,我們就必須要多做一些前置需求。

為什麼要用 NoSQL?SQL 和 NoSQL 差在哪?可以參考以下文章:

閃開!讓專業的來:SQL 與 NoSQL - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天

前置作業:MongoEngine

雖然 Django 內建並不支持 MongoDB,但是其實有一個套件可以幫助我們從 Python 連接 MongoDB:這個套件叫做 MongoEngine。

mongoengine

所以,現在正式進入第一步:我們先進入為專案建立的虛擬環境 env,然後使用套件管理工具 pip 來安裝這個套件:

pip install mongoengine

注意:一定要確保打指令前 terminal (終端機) 的最前面有寫一個括號寫著你虛擬環境的名字,否則套件會被裝到你電腦上的 python,而不是這個專案的喔!

那麼因為我們的專案是基於 Django Rest Framework 的,因此我們同時也要安裝這個套件:Django Rest Framework MongoEngine,他可以讓我們在 Rest Framework 裡面使用 MongoEngine 連上的資料庫:

umutbozkurt/django-rest-framework-mongoengine

pip install django-rest-framework-mongoengine

接下來我們要養成一個好習慣,每次安裝新的套件以後,我們把本來的 requirements.txt 刪掉,輸入這個指令重新生成一份這個專案的套件清單:

pip freeze >> requirements.txt

然後就可以把我們安裝好的套件放入 Django 啦,在專案的設定檔 settings.py 裡面找到 INSTALLED_APPS 這個變數,加入新套件:

# settings.py INSTALLED_APPS = ( ... 'rest_framework', 'rest_framework_mongoengine', ... )

大功告成,現在我們的 Django 後端已經有連接 MongoDB 的能力了。迫不及待想要連上資料庫了嗎?等等,你現在連資料庫都沒有呢!

創建一個 MongoDB 資料庫

現在我們要為這個專案創建一個 MongoDB 資料庫,如果你已經會架設 MongoDB 資料庫了,可以直接跳過這個章節。

MongoDB 是一個資料庫管理系統,對一台主機或是一台伺服器而言,他就是一個持續運行的程式。那麼既然他是一個程式,我們當然可以下載這個程式然後安裝在自己的電腦上,這樣你的後端只要透過 localhost 就能在本地訪問到這個數據庫了!

如果你想要這樣做的話,你可以去 MongoDB 官方下載他們的 MongoDB Community Server,然後按照提示安裝到電腦後再運行就可以了。

MongoDB Community Download

但是這邊有一個很不錯的東西想要推薦給大家,這個東西叫做 MongoDB Atlas,他是 MongoDB 官方的一個線上資料庫租用服務,只要簡單的幾步驟就可以有自己的線上資料庫了。最重要的是,他有開放免費方案供大家使用,對第一次想接觸 MongoDB 的人而言我覺得非常友善!因此本文的教學我們會透過 MongoDB Atlas 建立一個免費的線上資料庫。

Managed MongoDB Hosting | Database-as-a-Service

首先無庸置疑的,你必須先註冊一個 MongoDB Atlas 帳號,這個部分就和你註冊大部分網站沒什麼區別,設置可以直接使用 Google 帳號登入~

登入以後我們可以先為我們的這次的專案在 MongoDB Atlas 建立一個 Project

建立一個新的 Project,名字可以就用和 Django 專案同一個

輸入完以後按下 Next,他會問你要不要在這個專案新增其他成員,很遺憾的我只有一個人 … 如果你有夥伴正在一起看這個系列,直接邀請他進入你現在創建的這個專案吧。

可以新增其他成員進入你的 Project,並且設定每個成員的權限

創建 Project 以後,我們可以在這個 Project 裡面創建一個新的 Cluster (叢集)。Cluster 就是我們具體要儲存資料的地方,至於為什麼要叫 Cluster (叢集) 呢?其實是因為 MongoDB 並不會把你的資料保存在同一台主機上,而是把他們分給好多台主機來保存。

有興趣的話可以看看:

MongoDB Sharding 分散式儲存架構建置 (概念篇) - Soul & Shell Blog

在我們的 Project 裡面建立一個 Cluster

點擊 Build 以後他會問你這個 Cluster 要選擇什麼方案,你可以根據具體的使用需求來選擇需要的方案,現在我們使用 Free 方案:

選擇一個適合的方案,最左邊有免費方案,太佛心了

選擇方案以後你可以選擇你的主機要被託管在哪一個服務商,還有你要部署在哪一個區域:

可以為你的 Cluster 選擇一個運營商還有區域

我選擇用 GCP (Google Cloud Platform) 的 台灣區域 (asia-east1),因為這樣主機離我最近,理論上連接的速度應該是最快的。

剛建立的 Cluster 需要一段時間的設置

太好了!現在在這個廣大的網路世界中有一個屬於你的資料庫了。但是你現在還沒有權限可以連接他哦!等 Cluster 建立成功以後,點擊他的 Connect 按鈕: 第一次點 Connect 按鈕,他會協助你設定 IP 白名單和帳號密碼

打開之後看到的畫面顯示了兩個步驟,第一步是你必須為你的資料庫設置一個白名單 (whitelist) ,只有來自這個白名單上面的 IP 的請求才會被資料庫接受。你可以選擇最左邊的 Add current IP,他會把你目前的 IP 位置加入白名單,所以如果你的 IP 不是浮動的話,你未來就可以用這台電腦連線了。

但是對我這種比較懶得人而言,就直接選擇最右邊的 Allow access from anywhere (允許任何地方連線) 吧!反正我們現在這個專案保存的資料也不值幾個錢💰

設定完了 IP 白名單以後,再來就是要幫自己建立一組使用者帳號和密碼,選自己不會忘記的帳密組合就可以了。如果你覺得不夠安全,下面也有一個按鈕可以幫你產生一組真的很安全 (?) 的密碼。

到這裡,你已經有了一個自己的資料庫,而且確定可以連上了。

使用 MongoDB Compass 來連線資料庫

(在這個章節,我們要安裝 Compass 來連線到我們的資料庫,如果你已經安裝好了,或是你不需要,可以直接跳過這個章節。)

現在想必你迫不及待想連接到你的資料庫了吧,這個時候點擊下一步,他會問你想要用什麼方式來連接: MongoDB 的連線方式分成了三個大類

這個時候我們選擇第三個 Connect using MongoDB Compass。

Compass 是 MongoDB 官方的一個 UI 資料庫管理軟體,我們用他就可以很輕鬆的查看和管理資料庫內的資料了!

選擇以後他會問你有沒有 Compass 了,我們選擇左邊的 I do not have MongoDB Compass:

如果你還沒有 Compass,在這裡可以選擇適合的版本下載

選擇適合的 Compass 版本下載下來,然後安裝到電腦上:

MongoDB 只需要一條 Connection String 就可以進行連接了

打開 Compass 以後,你可以使用 Connection String 來連線到某個資料庫。一條 Connection String 其實就已經代表了用戶名、密碼、主機位置、主機端口還有資料庫名稱了。

我們回到剛剛下載 Compass 的畫面,可以在下面找到我們的 Connection String,他通常是長這種格式:

mongodb+srv://<username>:<password>@<host>/<dbname>

<username> 是用戶名,現在應該只有一個,也就是你剛剛輸入的

<password> 是用戶對應的密碼

<host> 是 Cluster 或主機的位置,如果你是用安裝在本機的資料庫,可以輸入 localhost

<dbname> 是要連入的資料庫名稱

我們可以直接透過這個 Connection String 來連接我們的 Cluster: 第一次看到自己的資料庫

經過一波三折,你終於正式進入自己的 Cluster 了!你可以點擊左下角的 + 號新增一個資料庫在裡面。當然,想不到名字的話就用和專案同一個名字就可以了。 將 Django 連上建立好的資料庫

現在回到我們的 Django 專案吧,讓我們在 settings.py 加入一行程式碼,用來呼叫 MongoEngine 的 connect() 函數:

# settings.py connect("example-project", host="mongodb+srv://<username>:<password>@<host>")

別忘了在最上方 import 這個 function 哦:

# settings.py from mongoengine import connect

connect() 這個函數的第一個參數就是資料庫的名稱,也就是我們剛剛用 Compass 按下左下角的加號以後新建的那個資料庫

第二個參數則是我們的 connection string,最後面 dbName 的地方可以省略掉因為我們在第一個參數已經指定了。

大功告成!現在我們輸入熟悉的啟動指令來開啟伺服器:

python manage.py runserver 8080

沒意外的話你應該很華麗的得到了這個錯誤:

pymongo.errors.ConfigurationError: The "dnspython" module must be installed to use mongodb+srv:// URIs

我們來研究研究這個錯誤訊息。原來是因為我們的 mongoDB 使用了 SRV 紀錄 來進行連線,所以必須安裝 dnspython 這個套件,他才能正常的解析這個 SRV 紀錄:

pip install dnspython

好的,安裝以後我們再重新啟動一次伺服器:

等等!啟動前你是否記得重新生成你的 requirements.py ? 這個好習慣一定要養成喔,否則未來如果你要和其他人合作開發,套件東漏西漏會對其他人帶來很嚴重的困擾的 😠

先把本來的 requirements.txt 刪掉,然後重新生成一份:

pip freeze >> requirements.txt

生成以後就可以安心的啟動伺服器了:

python3 manage.py runserver 8080

如果啟動以後看到了熟悉的訊息:

September 07, 2020 - 14:53:25
Django version 3.1.1, using settings 'example_project.settings'
Starting development server at http://127.0.0.1:8080/
Quit the server with CONTROL-C.

恭喜你!我們順利的把 MongoDB 和 Django 接上了!原本 Django 內建的 DATABASES 設定我們也用不到了,把他留空即可:

# settings.py DATABASES = { 'default': { 'ENGINE': '', } }

結語

在這次的文章中,我們透過安裝 MongoEngine 和 Rest Framework MongoEngine 來串接我們架設在 MongoDB Atlas 上的免費資料庫。

在本系列的下一篇文章《菜雞也看得懂的 Django Rest Framework + MongoDB 接口設計實作教學》,我們將透過我們今天連上的 MongoDB 來在我們的 API 加入一些 Cool 功能。

《菜雞也看得懂的全端專案開發實作教學》是我把最近一年左右接觸到的開發技術用非常白話的方式寫成一個很詳細的系列,其中內容包含了前後端分離開發的基本概念、Django Rest Framwork + MongoDB 的後端開發、Docker 和 CircleCI 的自動化部署、React 以及 React Native 的前端開發等等,希望可以讓高中生、大學生甚至是已經出社會的人士,對開發有興趣卻不知道從哪裡下手的人們有一個入門的地方。

由於我也是從網路上反覆翻找大量資料,經過自己的解讀、理解以及實作後才打出這一系列的文章,難免可能會有觀念錯誤的部分,還請各位讀者可以向我指出,讓我有一個成長學習的機會 👍

如果你也是對專案開發有興趣的同學,或是正在跟著我們的系列教學,歡迎你加入我們 Chief Noob 的 Discord 菜雞開發社群,一起討論和互相學習:

Chief Noob - Discord

如果你喜歡我的文章,希望你可以給我一個 Clap 以及留言,這是對我持續創作的一個重要動力!

分享你的看法

暫無留言,你可以成為第一個留言的人!

author-avatar

關於作者

Yuanlin Lin 林沅霖

台灣桃園人,目前就讀浙江大學,主修計算機科學與技術,同時兼職外包全端開發工程師,熱愛產品設計與軟體開發。