Flask-SocketIO導入で発生した問題


私の場合はサービス側はFlask、フロントエンドはVueです.js.問題はすべてFlaskにある.
CORSドメイン間問題
この問題が私を不快にさせたのは、書き方の問題が原因だ.実際にSocketIOをインスタンス化したときにcorsに転送されましたallowed_originsのパラメータは*ですが、最後の問題は*では一重引用符を使用し、二重引用符は使用できません.これは前後のパラメータ記号の不一致によるものかもしれないと思いますが、単一引用符を書く必要はありません.
#      
socketio = SocketIO(app, cors_allowed_origins="*", async_mode='eventlet')
#      
socketio = SocketIO(app, cors_allowed_origins='*', async_mode='eventlet')

400エラー
これはNginxを構成する必要があります.投稿を参照して、次のように構成します.
location /
{
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

最初の行はnginxにHTTP/1.1通信プロトコルを使用するように伝えます.これはwebsoketが使用しなければならないプロトコルです.
2行目と3行目は、WebSocketを使用したい場合、httpアップグレードリクエストに応答するnginxに伝えます.
最後に400はまだ存在し、Vueで発見された.js上でpollingをポーリングすることを取り消して、websocketだけを残して、完璧です
Websocketにはリクエストヘッダがありません
リクエストヘッダのJWT情報は失効し、海外資料ではtokenをqueryに入れることをお勧めします.サービス側はtoken復号を受信する.
#   token   Bearer+  +token,   token    
data = decode_token(encoded_token=YourToken.split(' ', 1)[1])
#   id           
uid = data['identity']['uid']

ユーザidは復号データに含まれており、具体的にはJWTの原理を知ることができ、JWTのフォーマットはヘッダである.负荷署名(header+payload+signature)、負荷は情報を格納することができ、uidは中にあります.
データの戻りが遅い
これはドキュメントをよく見ない結果です.gunicornが起動したとき、公式にworkerをお勧めします.classはeventletを使います.
POSTメソッドではデータを受信できません
エラーメッセージは次のとおりです.
TypeError: wrap_socket() got an unexpected keyword argument '_context'

これはeventletの鍋です.Python.7バージョンでこのバグが発生します.しかしFlask-SocketIOはeventletがおすすめです.中国語圏の資料はすべてパラメータを変えると言って、どんなパラメータを変えてもはっきり言っていません.外国の資料ではPythonを3.6か3.8に変更すればいいと言われています.
参考資料:
  • 400エラー解決方法
  • 400エラー公式issue
  • 400エラー原理解釈
  • eventletはPython 3にあります。7上のバグ