python+fastapi+jinja2+mongodb,突然感觉整个人一下就轻松了,python学习之路

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值