Я следовал этому руководству, чтобы настроить сервер чата во 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>
Это выглядит так:
В данный момент вся таблица истории чата 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
в текстовое поле «Сообщение», чтобы отобразить историю чата, а не показывать все это при загрузке страницы?