使用Python在Notebook中连接数据库和保存用户名、密码。
安装MongoDB
- 官网下载地址:https://www.mongodb.com/download-center/community,选择合适的版本(推荐Current Release)、操作系统(win/mac)然后下载。
- 下载后参照官方安装说明:https://docs.mongodb.com/manual/installation/
macOS的安装tgz文件的流程:
- 解压下载的tgz文件,把里面的bin文件夹内的文件都拷贝到
/usr/local/bin
。 - 创建数据目录
sudo mkdir -p /usr/local/var/mongodb
- 设置数据目录权限
sudo chown my_mongodb_user /usr/local/var/mongodb
- 创建日志目录
sudo mkdir -p /usr/local/var/log/mongodb
- 设置日志目录权限
sudo chown my_mongodb_user /usr/local/var/log/mongodb
- 启动数据库
mongod --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log
windows安装MSI文件流程:
- 双击安装,选择Complete模式,勾选Install MongoDB as a server(Network server user),建议安装MongoDB Compass。
- 安装后服务默认会自动启动。
安装Pymongo
直接conda install pymongo
安装。
连接数据库
默认MongoDB服务运行在27017端口。
import pymongo
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
dblist = myclient.list_database_names()
dblist
上面这个代码输出数据库中的全部集合(最初为空)。需要关闭连接的话使用myclient.close()
。
增删改查
创建数据库和数据集合。
mydb = myclient['mytest'] #创建数据库
mycol = mydb["user"] #创建集合
mycol.delete_many({}) #清理集合
mydb.list_collection_names()
插入一条数据。
mydict = { "name": "Tom", "height": 167, "age": 18,'sex':1}
dbres = mycol.insert_one(mydict)
dbres
插入多条数据。
dbres = mycol.insert_many([{
"name": "Jack",
"height": 178,
"age": 17,
'sex':1
}, {
"name": "Rose",
"height": 166,
"age": 16,
'sex':0
}])
dbres
查询第一条。
dbres=mycol.find_one()
display(dbres,dbres['age'])
多条查询,注意find括号内是查询条件,即$in
表示姓名在列表中的学生。$eq
等于,$gt
大于,$lt
小于,$gte
大于等于,$lte
小于等于。更多查询方法参考官方文档https://docs.mongodb.com/manual/reference/operator/query-comparison/
dbres=mycol.find({'name':{'$in':['Tom','Rose']}}) #eq,gt,lt,gte,lte,in
for res in dbres:
display(res)
更新数据,第一个参数是查询对象,第二个是被更新的属性,注意要使用$set
才可以。
mycol.update_one({'name': 'Tom'}, {
'$set': {
'height': 189
},
'$currentDate': {
'lastModified': True
}
})
下面的代码用来查看结果。
dbres=mycol.find()
for res in dbres:
display(res)
创建注册和登录页面
注册页。
%%writefile ./web/reg.html
<!DOCTYPE html>
<form action="/reg">
<label for="name">name:</label><br>
<input type="text" id="name" name="name" value="Tom"><br>
<label for="pw">name:</label><br>
<input type="text" id="pw" name="pw" value="123456"><br>
<input type="submit" value="注册">
</form>
登录页。
%%writefile ./web/login.html
<!DOCTYPE html>
<form action="/login">
<label for="name">name:</label><br>
<input type="text" id="name" name="name" value="Tom"><br>
<label for="pw">name:</label><br>
<input type="text" id="pw" name="pw" value="123456"><br>
<input type="submit" value="登录">
</form>
增加reg和login路由
新增加两个路由函数,用来处理上面两个页面action发来的请求。
%%writefile run.py
from flask import Flask, escape, request, send_from_directory
import pymongo
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
dblist = myclient.list_database_names()
mydb = myclient['mytest']
mycol = mydb["user"]
#mycol.delete_many({}) #清理数据集合
app = Flask(__name__)
@app.route('/hello')
def hello():
name = request.args.get("name", "World")
return f'Hello, {escape(name)}!'
@app.route('/reg')
def reg():
name = request.args.get("name", "World")
pw = request.args.get("pw", "")
mydict = {"name": name, "pw": pw}
dbres = mycol.insert_one(mydict)
return f'注册成功!'
@app.route('/login')
def login():
name = request.args.get("name", "World")
pw = request.args.get("pw", "")
dbres = mycol.find_one({'name': name}) #eq,gt,lt,gte,lte,in
if dbres:
dbpw = dbres['pw']
if dbpw == pw:
return f'登陆成功, {escape(name)}!'
else:
return f'密码错误, {escape(name)}!'
else:
return f'用户不存在, {escape(name)}!'
@app.route('/web/<path:path>')
def send_js(path):
return send_from_directory('web', path)
if __name__ == "__main__":
app.run()
然后再次运行服务器:
import subprocess as sp
try:
server.terminate()
except:
pass
server = sp.Popen("FLASK_APP=run.py flask run --port=8087", shell=True)
server
最终测试
访问注册页,注册一个名字和密码。

显示注册成功,然后访问登录页,可以用刚才注册的名字和密码登录。

如果输入错误的name会提示用户不存在,如果输入错误的密码会提示密码错误。
欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】
每个人的智能新时代
如果您发现文章错误,请不吝留言指正;
如果您觉得有用,请点喜欢;
如果您觉得很有用,欢迎转载~
END
网友评论