大家好,这是皮爷给大家带来的最新的学习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数据库连接。
数据的准备
关于数据的准备,皮爷这里给大家准备好了一套测试数据。具体的测试数据内容,皮爷将会在之后的讲解中给大家展示。
数据的内容,皮爷这里使用的是:
这里可以免费创建最大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:peekpa2020@peekpa.ofyco.mongodb.net/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:peekpa2020@peekpa.ofyco.mongodb.net/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总结完毕。
获取代码的唯一途径:关注『皮爷撸码』,回复『代码』即可获得。
长按下图二维码关注,如文章对你有启发或者能够帮助到你,欢迎点赞,在看,转发三连走一发,这是对我原创内容输出的最大肯定。