基于Python的Flask框架制作动态网站-第四部

数据持久化

之前网站有个缺点,重启服务后,之前的聊天信息没有了,因此需要引入数据库保存聊天数据。

MongoDB

https://www.mongodb.com/

  1. MongoDB是一个基于分布式文件存储的数据库。
  2. 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("/", 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("//")
def send_message(username, message):
    """
    通过路由设置:/人名称/信息内容 来实现发送信息给某人
    添加信息到列表里面,然后返回到用户页面
    """
    add_messages(username, message)
    return redirect("/" + username)

app.run() # 启动服务器

你可能感兴趣的:(Python,flask,python,后端)