Python HTML Веб-чат с mysql записями базы данных - PullRequest
1 голос
/ 25 марта 2020

Я создаю приложение для веб-чата в python. В основном все сообщения хранятся в MySQL БД, и мне нужно, чтобы они заполнялись в чате по одному.

Вот БД:

database picture

Здесь я генерирую 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» для обеих сторон диалога, и пропускает остальные сообщения.

1 Ответ

0 голосов
/ 29 марта 2020

Код перезаписывает шаблоны сообщений на каждой итерации циклов while. Возможно, вы захотите собрать каждый шаблон в списке, а затем объединить их, как только они будут собраны.

# Create a list to hold templates
yourmessagetemplates = []

yourmess.execute("SELECT yourmessages FROM lora_messages WHERE yourmessages != ''")
yourmsg = yourmess.fetchone()
while yourmsg is not None:
    yourmsg = yourmess.fetchone()
    yourmessagetemplates.append(f"<div class='chat'><div class='yours messages'><div class='message'>{yourmsg}</div></div>")

# Join the individual templates into a single piece of html.
yourmessagetemplate = '<br>'.join(yourmessagetemplates)


# Create a list to hold templates
mymessagetemplates = []


mymess.execute("SELECT mymessages FROM lora_messages WHERE mymessages != ''")
mymsg = mymess.fetchone()
while mymsg is not None:
    mymsg = mymess.fetchone()
    mymessagetemplates.append(f"<div class='chat'><div class='mine messages'><div class='message'>{mymsg}</div></div>")

# Join the individual templates into a single piece of html.
mymessagetemplate = '<br>'.join(mymessagetemplates)
...