pip install pymongo
pip install motor
安装mongodb
===随便操作,随心所欲
已放弃postgreSQL,搞得头大,不是连接不上,就是这有问题那有问题。普通人还是搞搞味道相同的,咱们都是对象哈哈😊
#mongo.py
from pymongo import MongoClient
from fastapi import FastAPI, status,WebSocket,Request
from pydantic import BaseModel
from typing import List
from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles
import emoji
import time
import uvicorn
def i():
num = 1
while True:
yield num
num += 1
y=i()
hd=('name','age','years')
s= emoji.emojize('Python is :thumbs_up:')
def get_top():
DB = "slack" #数据库名
MSG_COLLECTION = "messages" #集合名称
url="mongodb://localhost:27017/"#数据库连接地址
#with MongoClient(url) as client:
client_link=MongoClient(url)[DB][MSG_COLLECTION]#创建数据库和集合
return client_link
#在 Pydantic 中定义的消息类
class Message(BaseModel):
# _id: Optional[int] = Field(default=None, primary_key=True)
# _id:int
channel: str
author: str
text: str
# 实例化 FastAPI
app = FastAPI()
templates = Jinja2Templates('/root/py/templates')
app.mount('/static', StaticFiles(directory='/root/py/static'), name='static')
@app.get("/")
async def home(request: Request):
mydoc = get_top()
#doc=[x['channel'] x in mydoc.find()]或者 doc1=[x x in mydoc.find()]以列表形式返回全部数据库数据
去除列表框doc=doc[0]或者doc=doc['channel']python列表操作后返回无列表符号数据
doc=[]
for dc in mydoc.find({},{"_id": 0,"channel":1}):
doc.append(dc)
data_all={"request":request,
"doc":doc,
"hd":hd,
"s":s,
}
return templates.TemplateResponse("index.html",data_all)
@app.get("/status")
def get_status():
"""获取消息服务器的状态."""
return {"status": "running"}
@app.get("/channels",response_model=List[str])
def get_channels(request:Request):
"""以列表形式获取channel所有文本.注:重复的文本不会显示"""
msg_collection = get_top()
distinct_channel_list = msg_collection.distinct("channel")
#return distinct_channel_list
data={"distinct_channel_list":distinct_channel_list,"request":request,}
return templates.TemplateResponse("index.html",data)
@app.post("/post_message", status_code=status.HTTP_201_CREATED)
def post_message(message: Message):
"""向指定结构体Message发送新消息"""
msg_collection = get_top()
result = msg_collection.insert_one(message.dict())
ack = result.acknowledged
return {"insertion": ack}
@app.websocket("/ws")
async def websocket_endpoint(websocket:WebSocket):
try:
#等待socket连接并建立连接
await websocket.accept()
while True:
#接收客服端传回的数据
data1 = await websocket.receive_text()
#向客户端发送,接收到的数据
await websocket.send_text(f"你输入的是: {data1}")
#
if data1=='1':
g='这是我额外给你的奖励'
data2="你输入正确了!"
#if判断客服端发来的数据并处理客户端发来的数据data后重新发送给客户端发
await websocket.send_text(f" {data2} {g}")
else:
pass
except:
#客户端连接情况反馈信息
print('断开连接')
print('当前连接次数: '+str(next(y)))
u=time.time()
d=time.strftime("此连接断开时间 :%Y-%m-%d %H:%M:%S",time.localtime(u))
print(d)
if __name__=="__main__":
uvicorn.run(app, host="172.23.140.174", port=3389)
<!--index.html-->
{% extends "/base.html" %}
{% block head %}
<title>Fastapi+Fastsqlmodel+jinja2+socketserver
</title>
<link href="static/css/styles.css" rel="stylesheet">
<link href="static/css/socket.css" rel="stylesheet">
{% endblock head %}
{% block body %}
<h1>用户页面</h1>
<!--python对象显示在html测试页面-->
{% for x in hd %}
<p>{{x}}</p>
{% endfor %}
<p>{{s}}</p>
<!--数据库数据简单显示测试-->
<p>{{response_msg_list}}</p>
<p>{{distinct_channel_list}}</p>
<p>{{doc}}</p>
<!--socketserver-->
<form action="" onsubmit="sendMessage(event)">
<input type="text" id="messageText" autocomplete="off"/>
<button>Send</button>
</form>
<ul id='messages'></ul>
{% include "js/socket.js" %}
<!--db_send_json-->
<input type="text" id="channel" placeholder="channel">
<p id=channel1></p>
<input type="text" id="author" placeholder="author">
<input type="text" id="text" placeholder="txt">
<!-- Button to send data -->
<button id="send">Send JSON</button>
{% include "js/sendjson1.js" %}
<img src="static/images/1.png" alt="" width="30" height="24">
<h1> A super stylish home page </h1>
<p>
Python really interesting content, full of buzzwords like AI and MACHINE LEARNING!
</p>
{% endblock body %}
<!--sendjson1.js-->
<script async>
Buttons=document.getElementById("send")
Buttons.addEventListener("click",sendJSON)
Buttons.addEventListener("click",reload);
function reload() {
reload = location.reload();
//setTimeout(refresh , 3000);
}
function sendJSON(){
let result = document.querySelector('.result');
let channel = document.querySelector('#channel');
let author = document.querySelector('#author');
let text= document.querySelector('#text');
// Creating a XHR object
let xhr = new XMLHttpRequest();
let url = "/post_message";
// open a connection
xhr.open("POST", url, true);
// Set the request header i.e. which type of content you are sending
xhr.setRequestHeader("Content-Type", "application/json");
// Create a state change callback
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
// Print received data from server
result.innerHTML = this.responseText;
}
};
var data = JSON.stringify({ 'channel':channel.value,'author':author.value,'text':text.value});
// Sending data with the request
if (channel.value.length>0 && (author.value.length>0 && text.value.length>0)){
xhr.send(data);
}
}
</script>
<!--socket.js-->
<script async>
var ws = new WebSocket("ws:/47.108.229.189:3389/ws");
ws.onmessage = function(event) {
var messages = document.getElementById('messages')
var message = document.createElement('li')
var content = document.createTextNode(event.data)
message.appendChild(content)
messages.appendChild(message)
};
function sendMessage(event) {
var input = document.getElementById("messageText")
ws.send(input.value)
input.value = ''
event.preventDefault()
}
</script>