Flask-SocketIO導入で発生した問題
2326 ワード
私の場合はサービス側はFlask、フロントエンドはVueです.js.問題はすべてFlaskにある.
CORSドメイン間問題
この問題が私を不快にさせたのは、書き方の問題が原因だ.実際にSocketIOをインスタンス化したときにcorsに転送されましたallowed_originsのパラメータは*ですが、最後の問題は*では一重引用符を使用し、二重引用符は使用できません.これは前後のパラメータ記号の不一致によるものかもしれないと思いますが、単一引用符を書く必要はありません.
400エラー
これはNginxを構成する必要があります.投稿を参照して、次のように構成します.
最初の行はnginxにHTTP/1.1通信プロトコルを使用するように伝えます.これはwebsoketが使用しなければならないプロトコルです.
2行目と3行目は、WebSocketを使用したい場合、httpアップグレードリクエストに応答するnginxに伝えます.
最後に400はまだ存在し、Vueで発見された.js上でpollingをポーリングすることを取り消して、websocketだけを残して、完璧です
Websocketにはリクエストヘッダがありません
リクエストヘッダのJWT情報は失効し、海外資料ではtokenをqueryに入れることをお勧めします.サービス側はtoken復号を受信する.
ユーザidは復号データに含まれており、具体的にはJWTの原理を知ることができ、JWTのフォーマットはヘッダである.负荷署名(header+payload+signature)、負荷は情報を格納することができ、uidは中にあります.
データの戻りが遅い
これはドキュメントをよく見ない結果です.gunicornが起動したとき、公式にworkerをお勧めします.classはeventletを使います.
POSTメソッドではデータを受信できません
エラーメッセージは次のとおりです.
これはeventletの鍋です.Python.7バージョンでこのバグが発生します.しかしFlask-SocketIOはeventletがおすすめです.中国語圏の資料はすべてパラメータを変えると言って、どんなパラメータを変えてもはっきり言っていません.外国の資料ではPythonを3.6か3.8に変更すればいいと言われています.
参考資料: 400エラー解決方法 400エラー公式issue 400エラー原理解釈 eventletはPython 3にあります。7上のバグ
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に変更すればいいと言われています.
参考資料: