当社はIT技術のオンライン教育を得意としたセミナー専門会社です。 | 一戸英男

ITエンジニアの技術力UPをお約束します。

備忘録:pythonマルチスレッド pasteサーバ redirectでエラー発生の場合の対処

備忘録:pythonマルチスレッド pasteサーバ redirectでエラー発生の場合の対処


python bottleフレームワークでは内部のマルチスレッドhttpサーバでpasteサーバが使われるケースが多い。しかし、redirect処理を行った際にエラーが吐かれてしまうという問題に遭遇しました。処理自体は問題なく動作するのですがやはり気になります。この問題を解決するためにpasteサーバ関連で呼び出されるライブラリーのコードをトレースして原因がわかりました。この記事はその備忘録として残します。

実際に起きてるエラーはこんな感じ。

そもそも20行目の「TypeError: a bytes-like object is required, not ‘str’」これが勘違いのもとだった。よくある関数returnでHTMLテンプレートに返す際にencodeやdecode処理でutf-8に変換しないと駄目な場合があります。これが抜けているのかな!?と思いきや全く違うところに問題があった。

pasteサーバでredirect処理した場合に発生するエラー出力結果

python3になってからstringsは文字コードの扱いがUnicodeに変わりました。しかしネットワーク上での通信はbyte stringになる必要があり、よく使われるライブラリーではこのUnicodeへの対応がきっちり済んでいるため問題が生じるケースが少ないのですが稀にpython2.x時代からpython3ソースコード対応が中途半端なものがあります。つまり移行が完全にできていないケースだったようです。幸いにも原因は15行目のこれ「self.wsgi_write_chunk(”)」が原因であることにすぐに気がつけた。つまりhttpプロトコルのメッセージヘッダ項目やメッセージボディが空っぽの場合にきちんと処理ができなくて20行目のエラーになってしまうというものです。


まとめると、redirectの処理はメッセージヘッダの一部項目が空であるため、ライブラリーが誤って20行目のエラーを吐き出してしまう。これを回避するためにredirectへ具体的なレスポンスコードを指定してあげることでメッセージヘッダ項目が空になることを防ぐ。

リダイレクト レスポンスコード

  • 301 Moved Permanently
  • 302 Found(Moved Temporary
  • 303 See Other
  • 307 Temporary Redirect

redirectの際にレスポンスコード301を入れて空になるのを防いだところエラーが消えた

タグ: , , ,

Python3 Bottleフレームワーク入門(その6)- Abort and Redirect


本記事ではアボート処理とリダイレクトについて説明する。abortの出番はWEB上のコンテンツを作る上では重要である。よくあるのはアクセス禁止、ファイルが存在しないケースだろう。特に後者はCMSの世界ではソフトウェア404を使うケースが多い。でもグーグルがソフトウェア404だと正しく認識してくれないため検索インデックスに該当ファイルが無いという認識が持てず古いインデックスを更新しません。結果的に悪い評価になってしまうことがあります。このような場合はabort関数を使用してハードウェア404を返してあげるとベターです。

アボート処理

アボート処理はWEB上で異常を示すエラーコードと共に使用するものです。

リダイレクト処理

リダイレクト処理は何らかの理由があって、最初のURLから別のURLへ転送します。

※この2つの関数redirect(),abort()は必ず実行するとException Errorを起こしますが気にする必要はありません。使うと発生するそのようなものと解釈してください。元々そのような仕様で作られています。つまり何らかの異常を示す際に使う関数であるからと理解するとわかり易いかもしれません。エラーを抑制したい場合はBottleのconfigでcatchallをFalseに設定することで止めることができます。



Python Bottle Framework入門 全13回
1.基礎編サーバ起動
2.リクエストメソッド
3.ORM Peewee (MySQL)
4.ORM Peewee CRUD
5.Cookie And Session
6.Abort and Redirect
7.マルチスレッドWEBサーバ
8.デーモン化
9.Json
10.WSGI on SSL
11.Apache連携起動(外部WSGI) SSL接続
12.Apache連携起動(ReverseProxy)SSL接続
13.hprox連携起動(ReverseProxy)SSL接続&HTTP2対応

合わせて読みたいPython MySQL操作関連

タグ: , , , ,