bottleで他サイトからのAjaxリクエストを受け入れる (CORS)

決済サービスなどと連携するために他サイトからのリクエストを受け入れる必要もあるかと思います。Ajaxで使われるXMLHttpRequestなどは標準ではブラウザー側で他ドメインへのリクエストを制限しているので、一工夫が必要になります。

@route('/path/to/app', method='OPTIONS')
def support_cors():
    res = HTTPResponse(status=200, body=None)
    res.set_header('Access-Control-Allow-Origin', 'https://example.com')
    return res

まずは上のコードで事前に送られてくるOPTIONSリクエストに対して、クロスドメインでのリクエストが可能であることを返します。具体的にはAccess-Control-Allow-Originヘッダーでリクエストを許可するオリジン(ドメイン)を指定します。このヘッダーによってブラウザーはクロスドメインでのリクエストが可能であることを認識します。

@route('/path/to/app', method='POST')
def get_data():
    data = { 'foo': 'bar' }
    res = HTTPResponse(status=200, body=json.dumps(data))
    res.set_header('Content-Type', 'application/json')
    res.set_header('Access-Control-Allow-Origin', 'https://example.com')
    return res

それから本番のPOSTリクエストが来るので、改めて、Access-Control-Allow-Originヘッダーを付けて所望のレスポンスを返します。