Werkzeug: CORSサポート

作成日 2011年11月03日  ·  16コメント  ·  ソース: pallets/werkzeug

CORSをサポートするといいでしょう[1] [2]

静的ファイルでさえそれをサポートする必要があります

[1] http://www.w3.org/TR/cors/
[2] http://enable-cors.org/

最も参考になるコメント

また、werkzeugにすべてのミドルウェアを追加する必要はないと思うので、これを閉じたいと思います。

全てのコメント16件

Werkzeugは、WSGIアプリケーションで返す応答にヘッダーを設定できるという点ですでにCORSをサポートしています。 「CORSをサポートする」ためにWerkzeug内で他に何ができるか、または何をすべきかわかりませんが、それについて詳しく説明していただけますか?

私はOPではありませんが、CORSはほとんど定型的なヘッダーインジェクションであるため、設定/パラメーターとして使用することをお勧めします。 このスニペットの線に沿った何かがここにあります-特にオプションがないので、プリフライトは問題になります...

    if 'cors' in config and config['cors'] is True:
        response.headers.add('Access-Control-Allow-Origin', '*')
        response.headers.add('Access-Control-Allow-Methods',
                             'GET,PUT,POST,DELETE,PATCH')
        response.headers.add('Access-Control-Allow-Headers',
                             'Content-Type, Authorization')

...あなたはPythonのマントラを知っています:「バッテリーが含まれています」...;)

しかし、CORSは、特にCookieなどを使用する場合、 *許可するだけではありません。 個人的には、20 LoC WSGIミドルウェアを使用して、CORSヘッダーを追加し、プリフライトリクエストに応答します。 それほど難しいことではありません。

@ posativ-要点を共有してみませんか? :)

非常に限られた形式で:

from werkzeug.datastructures import Headers

class CORSMiddleware(object):
    """Add Cross-origin resource sharing headers to every request."""

    def __init__(self, app, origin):
        self.app = app
        self.origin = origin

    def __call__(self, environ, start_response):

        def add_cors_headers(status, headers, exc_info=None):
            headers = Headers(headers)
            headers.add("Access-Control-Allow-Origin", self.origin)
            headers.add("Access-Control-Allow-Headers", "Origin, ...")
            headers.add("Access-Control-Allow-Credentials", "true")
            headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, etc")
            headers.add("Access-Control-Expose-Headers", "...")
            return start_response(status, headers.to_list(), exc_info)

        if environ.get("REQUEST_METHOD") == "OPTIONS":
            add_cors_headers("200 Ok", [("Content-Type", "text/plain")])
            return [b'200 Ok']

        return self.app(environ, add_cors_headers)

# usage
app = CORSMiddleware(make_app(...), "http://example.org/")

このクラスを拡張して、カスタムヘッダー、クレデンシャル、ワイルドカードを含めることができます。

@ posativ-ありがとうございます。来週初めにそのプロジェクトの作業を再開するときに試してみます。 :)

これを上げる必要があります。

相対的な質問http://stackoverflow.com/questions/19382431/set-header-on-werkzeug-exception

関連行: https

start_response('500 INTERNAL SERVER ERROR',すると、 Access-Control-Allow-Origin: *ようなCORSヘッダーを追加するのが難しくなります。 しかし、不思議なことに、すでにX-XSS-Protection: 0があります。

Flask-CORSを有効にして、Chromeでトリッキーなリモートajax API呼び出しをデバッグしていますが、Flaskに例外があると、CORSが原因でデバッグコンテンツを表示できません。 このヘッダーをデバッグモデルに追加できますか?

デバッガーにCORSヘッダーを設定するのはなぜですか? そして、なぜあなたはラッピングミドルウェアでそれを行うことができないのですか?

また、werkzeugにすべてのミドルウェアを追加する必要はないと思うので、これを閉じたいと思います。

@unititaker

デバッガーにCORSヘッダーを設定するのはなぜですか?

これはクロスドメインAJAXリクエストによって呼び出されるトリッキーなシナリオであるため、では、一連のjavascriptイベントがトリガーされた後にのみChrome DevToolでデバッグできます。CORSヘッダーがない場合、ChromeDevToolはコンテンツをまったく表示しません。 何も見えません。 500サーバーエラーのある空白のページしか見つめられません。

そして、なぜあなたはラッピングミドルウェアでそれを行うことができないのですか?

ラップされたミドルウェアはNORMAL (適切に返されたFlaskアプリケーション)ページでのみ機能しますが、Werkzeug例外デバッガーが発生するとまったく機能しないためです。

これがあなたが言及している「ラッピングミドルウェア」です。https://github.com/corydolphin/flask-cors/issues/67低レベルのWerkzeugのものが調整されない限り、私たちはそれについて多くを行うことができないことがわかります。

@untitakerはリンクしたソースコードを見ていなかったと

qq20160420-3

@lambdaq今あなたはです

デバッグラップされたアプリケーションをラップアラウンドするミドルウェアは、デバッガーの場合でもstart_responseの動作を変更する可能性があるため、貼り付けてリンクしたコードは完全に無関係のようです。
corsミドルウェアのラップアラウンドはそれを変更する可能性があるため

異なる視点/理解のために、おそらくあなたの正確な問題を見逃しているので、壊れている/不可能と思われる正確なユースケースの概要を説明してください

app.runを呼び出すときにデバッガミドルウェアが適用されるため、状況は少しトリッキーになります。 それでも、CORSとデバッガミドルウェアの両方を手動で適用することで、これを回避できます。 IMOこれはそのようなエッジケースには問題ありませんが、セキュリティを損なうことのない方法でデバッガミドルウェアを変更するための具体的な提案がある場合は、それらを提案してください。 でも簡単な変更は知りません。

また、Werkzeugのコードもよく知っています。 それが私がそれを維持している理由だと思いますか?

申し訳ありませんが、私の言語をお詫び申し上げます。Werkzeugは素晴らしいプロジェクトです。

これらのstart_response()行をモンキー編集し、開発環境にCORSヘッダーブルートフォースを追加するだけでよいと思います。これは、毛深いミドルウェアよりも便利です。

また、500応答が返ってきた場合にデバッガーにリダイレクトする、代わりにJSコードを追加することを検討することもできます。

@untitaker JSコードは何もできません。500エラーがある場合は、httpステータスコードが500であることが求めているものです。

また、jsコードは、別のチームによって開発された、大量のコンテンツを含むヘアリーコンパイルされたreactjsであり、300秒以上でnpm run devかかります。 デバッグ行を微調整したり追加したりするのは簡単ではありません。

#1699はこれを解決すると思います。 Werkzeugは#1699よりも多くのことを実行できますが、アクセサメソッド(キャッシュ制御など)を提供し、それに基づいて構築されたツール(Flask-CORSやQuart-CORSなど)がCORSロジックを実行できるようにする必要があると思います。

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

SimonSapin picture SimonSapin  ·  12コメント

davidism picture davidism  ·  9コメント

androiddrew picture androiddrew  ·  14コメント

sorenh picture sorenh  ·  4コメント

lepture picture lepture  ·  6コメント