Symfoware

Symfowareについての考察blog

Falcon 「Access-Control-Allow-Origin」の回避方法

久しぶりにPython + FalconでAPIサーバーを作ってみようと思います。
Python + Falconで高速APIサーバーを作成する


サンプル



自端末にindex.htmlを作成。


  1. <!doctype html>
  2. <html lang="ja">
  3.     
  4. <html>
  5. <head>
  6.     <meta charset="UTF-8">
  7.     <title>falcon</title>
  8.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9.     <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  10. </head>
  11. <body>
  12.     <div><input type="button" id="test" value="クリック"></div>
  13.     <span id="result"></span>
  14. </body>
  15. <script>
  16. $(function() {
  17.     $('#test').on('click', function() {
  18.         $.ajax({
  19.             type : 'GET',
  20.             url : 'http://192.168.1.103:8000/'
  21.         }).done(function(data){
  22.             $('#result').html(data.message);
  23.         });
  24.     });
  25. });
  26. </script>
  27. </html>





  1. $ python -m SimpleHTTPServer



として、簡易httpサーバーを起動し、動作確認することにしました。


別の端末(192.168.1.103)で起動するfalconのソースはこんな感じです。


  1. # -*- coding:utf-8 *-
  2. import json
  3. import falcon
  4. class HelloResource(object):
  5.     
  6.     def on_get(self, req, res):
  7.         msg = {
  8.             "message": "Welcome to the Falcon"
  9.         }
  10.         res.body = json.dumps(msg)
  11.         
  12.         
  13.         
  14. app = falcon.API()
  15. app.add_route("/", HelloResource())
  16. if __name__ == "__main__":
  17.     from wsgiref import simple_server
  18.     httpd = simple_server.make_server("0.0.0.0", 8000, app)
  19.     httpd.serve_forever()




8000ポートで起動。リクエストを待ち受けます。
当然ながら、別のドメインなのでJavaScriptは以下のエラーを出力。


XMLHttpRequest cannot load http://192.168.1.103:8000/.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:8000' is therefore not allowed access.






回避策



こちらが参考になりました。
Falcon CORS

Access-Control-Allow-Originヘッダーを設定すればOK。


  1. # -*- coding:utf-8 *-
  2. import json
  3. import falcon
  4. class CORSMiddleware:
  5.     def process_request(self, req, resp):
  6.         resp.set_header('Access-Control-Allow-Origin', '*')
  7. class HelloResource(object):
  8.     
  9.     def on_get(self, req, resp):
  10.         msg = {
  11.             "message": "Welcome to the Falcon"
  12.         }
  13.         resp.body = json.dumps(msg)
  14.         
  15.         
  16.         
  17. app = falcon.API(middleware=[CORSMiddleware()])
  18. app.add_route("/", HelloResource())
  19. if __name__ == "__main__":
  20.     from wsgiref import simple_server
  21.     httpd = simple_server.make_server("0.0.0.0", 8000, app)
  22.     httpd.serve_forever()




プログラム修正後、ブラウザの表示を確認してみます。

752_01.png

752_02.png

ボタンをクリックすると、狙い通りのデータが取得できました。


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/06/05(月) 00:24:18|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<日本語形態素解析システム JUMANをDebian 8にapt-getでインストールする | ホーム | PythonでUPnPによるポートマップ(なぜなに Torrent)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1991-b1de278b
この記事にトラックバックする(FC2ブログユーザー)