Flask / Jinja - отображать содержимое базы данных командой вместо загрузки страницы - PullRequest
0 голосов
/ 24 октября 2018

Я следовал этому руководству, чтобы настроить сервер чата во Flask (Python 3), который хранит историю чата в базе данных MySQL: https://www.youtube.com/watch?v=pigpDSOBNMc

В итоге я получил следующее для main.py:

from flask import Flask, render_template
from flask_socketio import SocketIO, send
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecret'
socketio = SocketIO(app)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root@127.0.0.1/chat_db'
db = SQLAlchemy(app)

class History(db.Model): # Call 'History' table from 'chat_db' database
    id = db.Column('id', db.Integer, primary_key=True) # Define 'id' column
    name = db.Column('name', db.String(500)) # Define 'name' column
    message = db.Column('message', db.String(500)) # Define 'message' column

@socketio.on('message')
def handleMessage(name, msg): # Pass 'name' & 'msg' from the socket
    print('Message: ' + msg) # Print the message to terminal

    message = History(name=name, message=msg) # create 'message' variable where 'message'...
    # ...in 'message=msg' is the 'message' column in the 'History' table...
    # ...and the 'msg' in 'message=msg' is the passed-in 'msg' variable from the socket.
    db.session.add(message) # Add 'message' from the client...
    db.session.commit() # ... and commit (save) the message to the database.

    send(command(name, msg), broadcast=True) # Broadcast the message (display on the web page)

def command(name, msg):
    send_back = ""
    if (msg == "/load-history"):
        send_back = "Command recognized"
    else:
        send_back = "<b>"+name+"</b>"+': '+msg # Broadcast the message (display on the web page))
    return send_back

@app.route('/')
def index():
    messages = History.query.all() # Query all rows from chat 'History' table
    return render_template('index.html', messages=messages)

if __name__ == '__main__':
    socketio.run(app)

и следующее для templates / index.html:

<html>
<head>
<title>Chat Room</title>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.8/socket.io.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
</head>
<body>
<script type="text/javascript">
$(document).ready(function() {
    var socket = io.connect('http://127.0.0.1:5000');
    socket.on('message', function(msg) {
        $("#messages").append('<li>'+msg+'</li>');
        console.log('Received message');
    });
    $('#sendbutton').on('click', function() {
        socket.send($('#myName').val(), $('#myMessage').val());
        $('#myMessage').val('');
    });
});
</script>
<ul id="messages" style="list-style: none;">
    {% for msg in messages %}
        <li>{{ ': '+msg.message }}</li>
    {% endfor %}
</ul>
<input type="text" id="myName" placeholder="Username">
<input type="text" id="myMessage" placeholder="Message">
<button id="sendbutton">Send</button>
</body>
</html>

Это выглядит так: enter image description here

В данный момент вся таблица истории чата History загружается при загрузке страницы из этой части main.py :

@app.route('/')
def index():
    messages = History.query.all() # Query all rows from chat 'History' table
    return render_template('index.html', messages=messages)

Как я мог изменить свой код, чтобы ввести команду /load-history в текстовое поле «Сообщение», чтобы отобразить историю чата, а не показывать все это при загрузке страницы?

1 Ответ

0 голосов
/ 24 октября 2018

Ваше сообщение содержит « имя : сообщение »

Итак, вы проверяете, является ли сообщение / история загрузок, но на самом деле ваше сообщение всегда имеет префиксот "** name: **"

Это потому, что вы отправляете ваше сообщение как usinng socketio в JS:

socket.send($('#myName').val()+': '+$('#myMessage').val());

Вы должны отправить сообщение И имя в 2 различных переменных и изменить свойкод Python, чтобы принять это

@socketio.on('message')
def handleMessage(name, msg):

    message = History(name=name, message=msg)
    db.session.add(message)
    db.session.commit()

    send(msg, broadcast=True) 

И JS:

socket.send($('#myName').val(), $('#myMessage').val());
...