html 我如何摆脱这个错误405?( flask /Py)

hkmswyz6  于 2023-04-18  发布在  其他
关注(0)|答案(4)|浏览(108)

我想用Flask和www.example.com制作一个聊天应用程序socket.io,但每当我点击“发送”时,我总是收到错误405。我一直在尝试使其工作,但它就是不会(只是一个基本的用户名和消息)。下面是错误的内容:
“不允许的方法不允许用于请求的URL的方法。”
我真的不知道出了什么问题。当我检查我的cmd时,我看到:
Copyright © 2018 - 2019127.0.0.1socket.io/?EIO=3&transport=websocket&sid=7392cec39d5841bcaa7d7c8faaa1b6fbjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsjsj
main.py:

from flask import Flask, render_template #Importation du modèle flask et de render_template
from flask_socketio import SocketIO #Importation du modèle socketio

app = Flask(__name__)
app.config['SECRET_KEY'] =b'\xba!\xe3];\xce\xe6V}\x1d\xee\xda\x03\x8b\xbfS\xb9\x0fE\x8f\x15\x98O\x92' #Clé secrète afin de garder la partie client sécurisée
socketio = SocketIO(app)

@app.route('/')
def index(): #Définition de la fonction index
    return render_template('index.html') #Affichage de la page index.html

def messageReceived(methods=['GET', 'POST']): #Définition de la fonction message reçu
    print('Message reçu')

@socketio.on('my event') 
def handle_my_custom_event(json, methods=['GET', 'POST']): #Définition de la fonction message envoyé
    print('Mon événement a été reçu: ' + str(json))
    socketio.emit('Ma réponse', json, callback=messageReceived) #Émission du message

if __name__ == '__main__':      #Boucle permettant à l'application web de continuer de fonctionner à l'infinie
    socketio.run(app, debug=True)

index.html:

<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Chat Flask</title>
        <link rel="stylesheet" href="{{url_for('static', filename='index.css')}}">
    </head>
    <body>
        <p id="para1" style='color: #9cd374;font-size: 30px;'>Pas de message...</p>
        <div class="message_holder"></div>
        <form action="" method="POST">
            <div class="inputs">
            <input type="text" id="username" placeholder="Nom d'utilisateur"/>
            <input type="text" id="message" placeholder="Message"/>
            <input type="image" id="send" src="static/send.png"/> 
                <!-- Utilisation direct du <style> car le css ne fonctionne pas pour les entrées -->
                <style>
      input[type="email"] {
        text-align: center;
      }
      input[type="text"] {
        text-align: right;
      }
      input[type="tel"] {
        text-align: left;
      }
      body {
        text-align: center;
      }
      label {
        display: block;
        margin-bottom: 30px;
      }
    </style>
            </div>
        </form>
        <!-- Script JS nécessaire pour utiliser socketIO -->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
        <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
        <script type="text/javascript">
            var socket;
            $(document).ready(function(){
                socket = io.connect('http://' + document.domain + ':' + location.port + '/chat');
                socket.on('connect', function() {
                    socket.emit('joined', {});
                });
                socket.on('status', function(data) {
                    $('#chat').val($('#chat').val() + '<' + data.msg + '>\n');
                    $('#chat').scrollTop($('#chat')[0].scrollHeight);
                });
                socket.on('message', function(data) {
                    $('#chat').val($('#chat').val() + data.msg + '\n');
                    $('#chat').scrollTop($('#chat')[0].scrollHeight);
                });
                $('#text').keypress(function(e) {
                    var code = e.keyCode || e.which;
                    if (code == 13) {
                        text = $('#text').val();
                        $('#text').val('');
                        socket.emit('text', {msg: text});
                    }
                });
            });
      </script>
    </body>
</html>
h6my8fg2

h6my8fg21#

你似乎在使用这个博客:https://codeburst.io/building-your-first-chat-application-using-flask-in-7-minutes-f98de4adfa5d
首先,您应该尝试按照指南进行操作,而不进行任何修改。当您有一个工作解决方案时,然后您可以进行小调整,一个接一个,并始终检查它是否仍然有效,直到您有信心使用该技术。
我第一眼看到的一些问题:

  • io.connect('http://' + document.domain + ':' + location.port + '/chat');但是在你的服务器上,你没有定义路径,所以你应该只使用domain + port:'http://' + document.domain + ':' + location.port
  • 您已经定义了在服务器端监听的消息类型:@socketio.on('my event'),但你在JavaScript中发送不同的事件:socket.emit('joined', {});
  • 在服务器端,你向客户端发送类型为socketio.emit('Ma réponse', ...的事件,但在客户端,你监听的事件如下:socket.on('status', ...
q1qsirdb

q1qsirdb2#

回答主要问题:你的route /默认只接受GET请求。如果你想允许POST请求,你应该像这样修改这一行:

@app.route('/')
def index(methods=['GET', 'POST']):

您可能需要在其他功能中执行相同的操作。

wswtfjt7

wswtfjt73#

这将是一个很大的帮助,如果你可以粘贴整个日志,但在我看到你的index.html,我想你遇到了和我一样的问题。
在你的index.html中,你使用了非常老的socket io JS客户端(1.3.6):

<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>

也许你仔细看终端,它说(你省略):

"The client is using an unsupported version of the Socket.IO or Engine.IO protocols (further occurrences of this error will be logged with level INFO)"

要解决此问题,请参阅flask-socketio安装指南页面上的表格:

l7mqbcuq

l7mqbcuq4#

我刚刚遇到了同样的问题,我通过将标签html从input改为button并将javascript函数。submit改为。click来解决它
HTML:

<button type="button" id="send_sample">Sample</button>

JavaScript:

$('#send_sample').click(function(event) {
    socket.emit('be_send_sample', {data: 0});
});

我不知道这是不是最好的方法,但我就是这样做到的,希望对你有帮助。

相关问题