由于目前django框架使用MongoDB 文献并不好找。
本人特意总结使用django 连接 MongoDB 使用的坑。
关于连接MongoDB 数据库使用何种第三方库,一开始是打算使用pymongo(因为之前使用过爬虫保存过数据),后查阅资料,发现django 使用的使用的是mongoengine 进行连接。
自行安装依赖库:
pip install mongoengine -i https://pypi.tuna.tsinghua.edu.cn/simple
提供两种数据连接方案:mysql 和 mongodb
注意:可以同时使用两种数据库,并且不会发生冲突。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库驱动
'NAME': 'stu01', # 数据库名
'USER': 'root', # 用户名
'PASSWORD': 'root', # 密码
'HOST': '127.0.0.1', # 数据库地址
'PORT': '3306' # 链接数据端口
}
,
'mongotest': {
'ENGINE': None, # 把默认的数据库连接至为None
}
}
import mongoengine
# 连接mongodb中数据库名称为proxy_pool的数据库
conn = mongoengine.connect("proxy_pool")
DATABASES = {
'default': {
'ENGINE': None,
}
}
from mongoengine import connect
connect('数据库名')
DATABASES = {
'default': {
'ENGINE': None,
}
}
import mongoengine
conn = mongoengine.connect(
db="proxy_pool", # 需要进行操作的数据库名称
alias='default', # 必须定义一个default数据库
host="127.0.0.1",
port=27017,
username="root",#账号
password="root",#密码
authentication_source="admin", # 进行身份认证的数据库,通常这个数据库为admin“
)
view.py定以数据模型
from django.db import models
# 创建一个数据库user表模型
class User(models.Model):
# 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列
id = models.AutoField(primary_key=True)
# 类里面的字段代表数据表中的字段(username),数据类型则由CharField(相当于varchar)
username = models.CharField(max_length=100)
# 密码
password = models.CharField(max_length=100)
# 获取密码
# def getPassword(self):
# return self.password
'''
以下是mongodb使用数据模型
'''
import mongoengine
class SpiderModel(mongoengine.Document):
name = mongoengine.StringField(max_length=21)
# max_length字段最大长度
age= mongoengine.IntField(default=0)
# default设置默认值
meta = {'collection': 'proxies'} # 指明连接数据库的哪张表(/别名)
常规请求方案
class IndexView(View):
def get(self, request):
#实现是异步请求 方案
limit = int(request.GET.get("limit"))
page = int(request.GET.get("page"))
offset = (page - 1) * limit
lists = SpiderModel.objects.skip(offset).limit(limit)
#skip 跳过 (page - 1) * limit 后的 limit(条数据)
#设 page = 3
# page = 3-1 = 2
# limit = 2 * 10
# 则 offset =20 及 跳过 30行
counts = SpiderModel.objects().count()
# 总数
if lists:
json_list = []
for i in lists:
json_list.append(i._data)
data_j = json.dumps(json_list)
data_json = json.loads(data_j)
context = {"code": 0, "data": data_json, "count": counts, "msg": "0"}
return JsonResponse(context)
异步请求方案
def query_spider(request):
#实现是异步请求 方案
limit = int(request.GET.get("limit"))
page = int(request.GET.get("page"))
offset = (page - 1) * limit
lists = SpiderModel.objects.skip(offset).limit(limit)
#skip 跳过 (page - 1) * limit 后的 limit(条数据)
#设 page = 3
# page = 3-1 = 2
# limit = 2 * 10
# 则 offset =20 及 跳过 30行
counts = SpiderModel.objects().count()
# 总数
if lists:
json_list = []
for i in lists:
json_list.append(i._data)
data_j = json.dumps(json_list)
data_json = json.loads(data_j)
context = {"code": 0, "data": data_json, "count": counts, "msg": "0"}
return JsonResponse(context)
Paginator 及 django 内置分页类 -(规请求方案)
def query_spider(request):
#实现是异步请求 方案
limit = request.GET.get("limit")
page = request.GET.get("page")
lists = SpiderModel.objects
paginator = Paginator(lists, limit)
counts = SpiderModel.objects().count()
p_list = paginator.page(page)
if paginator:
#有时数据库响应缓慢,加以判断
json_list = []
for i in p_list:
json_list.append(i._data)
data_j = json.dumps(json_list)
data_json = json.loads(data_j)
context = {"code": 0, "data": data_json, "count": counts, "msg": "0"}
return JsonResponse(context)
# 页面查询用户信息
def query_users(request):
key = request.GET.get("key")
limit = request.GET.get("limit")
page = request.GET.get("page")
us = User.objects.all()
# 在绝大多数sql 优化中 不应把所有数据查出,会极大消耗服务器性能
# 不推荐使用该方案
paginator = Paginator(us, limit)
p_list = paginator.page(page).object_list
count = paginator.count
json_list = []
for v in p_list:
json_dict = model_to_dict(v)
json_list.append(json_dict)
data_j = json.dumps(json_list)
data_json = json.loads(data_j)
# 将数据发给页面
context = {"code": 0, "data": data_json, "count": count, "msg": "数据"}
return JsonResponse(context)
lists = SpiderModel.objects.skip(offset).limit(limit)