top of page

Ajax通信でのPython側の挙動の謎 解決

執筆者の写真: snackvirtualsnackvirtual

何をやっても以下が発生しつづけた

Access to XMLHttpRequest at 'http://localhost:5000/room/talk/data' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.

挙動を見ていると、どうもjavascript側ではなく、python側であることがわかってきた

javascript側のajaxはきちんとPOSTできているっぽい

なので、ここはいじらずにpython側だけを弄り倒す

まずはうまくいったものから始める

#!C:/Python310/python.exe 
# -*- coding: utf-8 -*-

#import sys

#recieve = sys.stdin.readline()
recieve = input()

print('Content-type: text/html\n')
print(recieve)

これはつまり、ajaxのurl部で設定されたこのファイルを

#!C:/Python310/python.exe でpythonで実行し、

標準入力で入力し、標準出力で出力して、終了するだけである

つまりこれは呼び出しのたびにpythonが実行されてしまう

この標準入力を強制的にajaxに設定するのを探したが…見つからない


なのでもう一度 Flaskに挑戦

javascript側

url_top ='http://localhost:5000/room/talk/data';    

      $(function(){
        $.ajax({
          url: url_top,
          type: 'POST',
          data: send_data,
          datatype: 'json',
        }).done(function(data){
          messages.textContent += 'ajax done\n';
          messages.textContent += `Return data : ${data}`;
          response_fee = data;
          onClickSend();
        }).fail(function(){
          messages.textContent += 'ajax failed\n';
        }); 
      });

python側

from flask import Flask, request

app= Flask(__name__)

@app.route('/room/talk/data', methods= ['GET', 'POST'])
def get_json():
    print("got some data")
    # read json + reply
    data= request.get_data()
    print(data)
    return data
if __name__== '__main__':
    app.run()

予想通りエラー発生

ん?しかし微妙に以前と違う

Access to XMLHttpRequest at 'http://localhost:5000/room/talk/data' from origin 'http://localhost' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
jquery-3.6.0.min.js:2          
POST http://localhost:5000/room/talk/data net::ERR_FAILED 200

ダメ元で以下を参考にして書き直す

from flask import Flask, request
from flask_cors import CORS

app= Flask(__name__)
CORS(app)

@app.route('/room/talk/data', methods= ['GET', 'POST'])
def get_json():
    print("got some data")
    # read json + reply
    data= request.get_data()
    print(data)
    return data
if __name__== '__main__':
    app.run()

動いたあああああ!

まだjsonフォーマットの不具合とかいろいろあるので、じっくりやろう






閲覧数:0回0件のコメント

最新記事

すべて表示

Comentarios


bottom of page