大家好,這是皮爺給大家帶來的最新的學習Python能幹啥?之Django教程的進階版。
在之前《用Django全棧開發》系列專輯裏面,皮爺詳細的闡述瞭如何編寫一個完整的網站,具體效果可以瀏覽線上網站:Peekpa.com
從進階篇開始,每一篇文章都是乾貨滿滿。這一節,我們來講述一下,在Django中,如何連接到MongoDB,並操作。
Peekpa.com的官方地址:http://peekpa.com
皮爺的每一篇文章,都配置相對應的代碼。這篇文章的代碼對應的Tag是“Advanced_01”。
前瞻回顧
在之前的《用Django全棧開發》系列裏面的Peekpa.com
裏面,我們使用的是MySQL數據庫,具體的配置可以參考《用Django全棧開發——04. 連接MySQL數據庫》那篇文章。
當時的配置主要是說要對peekpa/settings.py
文件中的DATABASES
變量就行修改即可。
那麼今天,我們主要講述的是如何讓Django和我們的MongoDB數據庫連接。
數據的準備
關於數據的準備,皮爺這裏給大家準備好了一套測試數據。具體的測試數據內容,皮爺將會在之後的講解中給大家展示。
數據的內容,皮爺這裏使用的是:
https://www.mongodb.com/cloud
這裏可以免費創建最大5GB存儲容量的MongoDB數據庫,並且交互存儲。當然,如果你的需求很大,可以付費獲取高級VIP會員服務,如下圖。
好了,這裏皮爺給大家準備的數據是我從日本氣象廳的官網上面爬取的日本地震信息。
每一條數據都是以下結構:
{
"_id" : ObjectId("5f0110fc601bd5114812c0fd"),
"jp_create_time" : "2020-7-5-7-30-4",
"jp_url" : "http://www.jma.go.jp/jp/quake/20200704232923395-05082651.html",
"jp_title" : "2020年 7月 5日08時26分",
"jp_id" : "2020070423292339505082651",
"jp_time_num" : "2020-07-04-08-26-51",
"jp_location_image_url" : "http://www.jma.go.jp/jp/quake/images/japan/20200704232923395-05082651.png",
"jp_location" : "岐阜県飛騨地方",
"jp_level" : "M3.1",
"jp_max_level" : "震度1",
"jp_time_text" : " 7月 5日08時29分"
}
具體到MongoDB中的關鍵信息如下(之後會用到,所以先羅列出來):
- Database:PeekpaMongoData
- Collection:JpEarth
- User:peekpa-user
- Password: peekpa2020
如何連接MongDB Cloud中的Atlas,網站中給我出我們連接方式。針對不同的Python版本,連接的代碼格式也不一樣。
我們這裏將要使用到的連接規則則是Python 3.6的:
mongodb+srv://peekpa-user:<password>@peekpa.ofyco.mongodb.net/<dbname>?retryWrites=true&w=majority
可以看到,上面需要被替換的尖括號裏的內容,就是之前羅列的基本信息。
Python連接MongoDB
一般而言,使用Python連接MongoDB數據庫的話,市面上主要有兩種方法:
- 第一種是使用PyMongo;
- 第二種是使用MongoEngine。
這裏我們主要使用PyMongo。因爲mongoengine實在是太難用了。接下來給大家一個小片段代碼,來展示一下PyMongo是如何連接數據的。
PyMongo
PyMongo目前最新的版本是3.4.0版本(2020年7月5日),官網地址是:https://api.mongodb.com/python/3.4.0/
使用pip安裝pymongo:
$ pip install pymongo
官網裏面有詳細的使用方法和API說明。感興趣的同學可以自己去看一看。
我們將之前連接Atlas的連接擴充一下,補充一個程序,顯示數據庫中前5條數據:
import ssl
import pymongo
if __name__ == '__main__':
client = pymongo.MongoClient(
"mongodb+srv://peekpa-user:[email protected]/Peekpa?retryWrites=true&w=majority",
ssl_cert_reqs=ssl.CERT_NONE)
db = client['PeekpaMongoData']
collection = db['JpEarth']
jp_list = collection.find()[:5]
for item in jp_list:
print(item)
print("Total Count: {}".format(jp_list.count()))
注意這裏,我們再調用pymongo.MongoClient
的時候,我們設置了不需要SSL驗證,即ssl_cert_reqs=ssl.CERT_NONE
。最後運行結果如下圖:
可以看到,PyMongo可以成功連接到MongoDB數據庫,並且可以通過find方法來獲取全部數據。
Django連接MongoDB
我們既然可以在Python中使用PyMongo連接到數據庫,那麼接下來,我們就要將地震信息在之前寫好的DataCenter裏面顯示了。
第一步,創建html
這裏的html比較簡單,通過使用extend繼承datacenter/base/center_base.html
文件,然後將裏面的block內容分別填充就可以,關鍵部分在如下的html部分,即展示地震信息的內容:
<div class="row">
{% for item in list_data %}
<div class="row col-sm-3 pl-1 pr-1 mb-4">
<div class="row col-sm-12">
<small>{{ item.jp_title }}</small>
</div>
<div class="row col-sm-12">
<a href="{{ item.jp_url }}">{{ item.jp_location }}</a>
</div>
<div class="row col-sm-12">
<small>{{ item.jp_level }}</small>
</div>
<div class="row col-sm-12">
<small>{{ item.jp_max_level }}</small>
</div>
</div>
{% endfor %}
</div>
這裏寫的很簡單,只是簡單的講數據拿出來,然後按列排開。
第二步,創建視圖函數
同樣和之前文章《 用Django全棧開發——20. 友鏈一條龍全套開發》提到的一樣,第二步需要些視圖函數。
我們就在datacenter
應用底下創建一個jpearth_view.py
文件,然後在裏面寫頁面的邏輯。邏輯很簡單,和之前文章讀取邏輯一樣。
不同的是,這裏的讀取數據是從MongoDB裏面讀取:
class JpEarthView(View):
client = pymongo.MongoClient("mongodb+srv://peekpa-user:[email protected]/Peekpa?retryWrites=true&w=majority",
ssl_cert_reqs=ssl.CERT_NONE)
db = client['PeekpaMongoData']
collection = db['JpEarth']
def get(self, request):
page = int(request.GET.get('p', 1))
list_data = self.collection.find()
print(list_data.count())
paginator = Paginator(list(list_data), 15)
page_obj = paginator.page(page)
context = {
"list_data": page_obj.object_list,
}
context.update(self.get_pagination_data(paginator, page_obj))
return render(request, 'datacenter/jpearth/manage.html', context=context);
然後我們需要修改datacenter/urls.py
文件中,添加我們的url映射:
path('jpearth/', JpEarthView.as_view(), name="jpearth_list_view"),
第三步,將URL入口寫到Sidebar中
這是最後一步,我們需要將新添加的日本地震信息
頁面的url寫到數據中心左側的菜單中。修改文件位置爲templates/datacenter/base/sidebar.html
,裏面只需要添加一個<li>
標籤就好:
{% url 'center:jpearth_list_view' as jpearth_manage_view %}
<li class="nav-item has-treeview {% if request.path == jpearth_manage_view %}menu-open{% endif %}">
<a href="{{ jpearth_manage_view }}" class="nav-link {% if request.path == jpearth_manage_view %}active{% endif %}">
<i class="nav-icon far fa-copy"></i>
<p>
日本地震信息
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="{{ jpearth_manage_view }}" class="nav-link {% if request.path == jpearth_manage_view %}active{% endif %}">
<i class="far fa-circle nav-icon"></i>
<p>MongoDB 數據源</p>
</a>
</li>
</ul>
</li>
這樣就大功告成了。我們來運行一下我們的程序,看看能不能從數據庫中正確的讀取出來數據:
而且還有翻頁功能的實現:
這樣,我們就能成功的在Django中,從MongoDB裏面讀取數據了。
技術總結
最後總結一下,
Django讀取MongoDB數據:
- 首先使用PyMongo來作爲讀取數據的工具;
- 最好先寫一個簡單的Python程序,將讀取數據的邏輯跑通了再在Django中集成;
- 使用PyMongo首先連接MongoDB,這樣就獲得了一個
client
實例,然後使用讀取字典的方式,分別獲取database = client['<database_name>']
和collection = databse['<collection_name>']
; - 然後就獲得了collection實例,之後就能操作數據庫了,增,刪,改,查都是可以的;
- PyMongo的使用手法有很多種,我們下一期詳細介紹;
- 進階篇的Django連接MongoDB總結完畢。
獲取代碼的唯一途徑:關注『皮爺擼碼』,回覆『代碼』即可獲得。
長按下圖二維碼關注,如文章對你有啓發或者能夠幫助到你,歡迎點贊,在看,轉發三連走一發,這是對我原創內容輸出的最大肯定。