Я создаю приложение для веб-чата в python. В основном все сообщения хранятся в MySQL БД, и мне нужно, чтобы они заполнялись в чате по одному.
Вот БД:
Здесь я генерирую HTML Шаблон:
class MyHttpRequestHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
# Sending an '200 OK' response
self.send_response(200)
self.send_header("Content-type", "text/html")
# Whenever using 'send_header', you also have to call 'end_headers'
self.end_headers()
query_components = parse_qs(urlparse(self.path).query)
if 'mymessage' in query_components:
MyMessage = query_components["mymessage"][0]
send_message = f'INSERT INTO lora_messages (mymessages, yourmessages) VALUES ("{MyMessage}", "")'
insertmsg.execute(send_message)
# Some custom HTML code, possibly generated by another function
styler = """
body {
font-family: helvetica;
display: flex ;
flex-direction: column;
align-items: center;
}
input[type=text] {
width: auto;
}
.chat {
-ms-transform: scale(1);
-webkit-transform: scale(1);
-moz-transform: scale(1);
-o-transform: scale(1);
transform: scale(1);
}
.messages {
margin-top: 30px;
display: flex;
flex-direction: column;
}
.message {
border-radius: 20px;
padding: 8px 15px;
margin-top: 5px;
margin-bottom: 5px;
display: inline-block;
}
.yours {
align-items: flex-start;
}
.yours .message {
margin-right: 25%;
background-color: #eee;
position: relative;
}
.mine {
align-items: flex-end;
}
.mine .message {
color: white;
margin-left: 25%;
background: linear-gradient(to bottom, #00D0EA 0%, #0085D1 100%);
background-attachment: fixed;
position: relative;
} """
html = f"""
<html>
<head>
<style>{styler}</style>
</head>
<h1>LoRa Chat</h1>
{mymessagetemplate}
{yourmessagetemplate}
<form action="" Method="GET">
<input type="text" id="body" name="mymessage">
<input type="submit" value="Submit">
</form>"""
# Writing the HTML contents with UTF-8
self.wfile.write(bytes(html, "utf8"))
return
# Create an object of the above class
handler_object = MyHttpRequestHandler
PORT = 8035
my_server = socketserver.TCPServer(("", PORT), handler_object)
my_server.allow_reuse_address = True
# Start the server
my_server.serve_forever()
Здесь я пишу while l oop и присваиваю его переменной, которую я добавил в шаблон HTML {yourmessagetemplate} и {mymessagetemplate}.
import http.server
import socketserver
import mysql.connector
from urllib.parse import urlparse
from urllib.parse import parse_qs
mydb = mysql.connector.connect(
host="localhost",
user="user",
passwd="pass",
database="allmessages",
autocommit=True
)
yourmess = mydb.cursor()
mymess = mydb.cursor()
insertmsg = mydb.cursor()
yourmess.execute("SELECT yourmessages FROM lora_messages WHERE yourmessages != ''")
yourmsg = yourmess.fetchone()
while yourmsg is not None:
yourmsg = yourmess.fetchone()
yourmessagetemplate = f"<div class='chat'><div class='yours messages'><div class='message'>{yourmsg}</div></div>"
mymess.execute("SELECT mymessages FROM lora_messages WHERE mymessages != ''")
mymsg = mymess.fetchone()
while mymsg is not None:
mymsg = mymess.fetchone()
mymessagetemplate = f"<div class='chat'><div class='mine messages'><div class='message'>{mymsg}</div></div>"
Как я могу заставить эту программу писать каждую строку одну за другой? В результате я получаю, что {yourmessagetemplate} показывает только последнее сообщение в БД, которое равно «None» для обеих сторон диалога, и пропускает остальные сообщения.