数据持久化
之前网站有个缺点,重启服务后,之前的聊天信息没有了,因此需要引入数据库保存聊天数据。
MongoDB
https://www.mongodb.com/
- MongoDB是一个基于分布式文件存储的数据库。
- MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式
环境配置
本地如何安装MongoDB
可以参考这个文章
Python引入库
pip3 install pymongo
使用例子
import pymongo
#连接数据库服务器 ↓
client = pymongo.MongoClient("localhost",27017)
#选择数据库 ↓
db_test = client.test #推荐使用:db_test = client["test"]
#获取集合 ↓
collection1 = db_test.col
#获取collection1集合内全部数据 ↓
x = collection1.find()
for i in x:
print(i)#打印一条数据
print(i["name"])#打印key=name的value值
print(type(i))#字典
完整代码
from datetime import datetime
from flask import Flask, redirect, render_template, request, session
import pymongo
app = Flask(__name__)
app.secret_key = "randomstring12345" # 大家可以不一样的,用于生成随机ID的随机种子,类似random的seed
client = pymongo.MongoClient("localhost",27017)
messages = client.test.messages # 代替原来的messages,
# messages = []
def add_messages(username, message):
# 添加消息,保存在列表里面
now = datetime.now().strftime("%H:%M:%S") # 记录时间:格式:00:00:00
messages_dict = {"timestamp": now, "from": username, "message": message} # 之前是字符串,现在换成字典保存
messages.insert_one(messages_dict) #保存到数据库
# messages.append(messages_dict)
@app.route("/", methods=["GET", "POST"]) # 允许的方法有POST和GET,其他不写methods默认就是GET
def index():
"""主页"""
if request.method == "POST":
# 如果是POST请求,进入这里,在请求中把username放到session里面
session["username"] = request.form["username"]
if "username" in session:
# 如果session中有username这个键值,就转跳到对应的用户页面
return redirect(session["username"])
# 如果没有,就展示首页网页。
return render_template("index2.html")
@app.route("/<username>", methods=["GET", "POST"])
def user(username):
if request.method == "POST":
# 如果是提交聊天内容,则在这里处理
username = session["username"]
message = request.form["message"]
add_messages(username, message)
return redirect(session["username"])
"""Display chat messages"""
message_data = []
r = messages.find({}, {"_id": 0}) # 不要ID
for v in r:
message_data.append(v)
return render_template("chat3.html", username=username,
chat_messages=message_data)
@app.route("/<username>/<message>")
def send_message(username, message):
"""
通过路由设置:/人名称/信息内容 来实现发送信息给某人
添加信息到列表里面,然后返回到用户页面
"""
add_messages(username, message)
return redirect("/" + username)
app.run() # 启动服务器
版权声明:本文为linkedin_21843693原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。