1

web2py の Restfull Web サービスで Cross Origin Resource Sharing (CORS) の実装に問題があります。

ここで提案されているように、web2py のサーバー側に CORS を実装しようとしています: ( https://groups.google.com/forum/#!msg/web2py/kSUtyNcUQGI/qfiIqfUiWLwJ )

models/0.py に以下を追加しました (コントローラーで実際の restfull api ハンドラーの前に応答ヘッダーを更新するため)。

===============================

if request.env.http_origin:
    response.headers['Access-Control-Allow-Origin'] = request.env.http_origin
    response.headers['Access-Control-Allow-Origin'] = "*"
    response.headers['Access-Control-Allow-Credentials'] = 'true'
    response.headers['Access-Control-Max-Age'] = 86400

    if request.env.request_method == 'OPTIONS':
        if request.env.http_access_control_request_method:
            print request.env.http_access_control_request_method
            response.headers['Access-Control-Allow-Methods'] = request.env.http_access_control_request_method
            if request.env.http_access_control_request_headers:
                response.headers['Access-Control-Allow-Headers'] = request.env.http_access_control_request_headers

==========================

RESTful POST と GET は現在機能していますが、PUT と DELETE は機能していません。これは、プリフライトの http OPTIONS リクエストが web2py によって「400 BAD REQUEST」として拒否されたためです。

たとえば、ローカル Web ページから ajax 呼び出しを使用して安静な Web サービスを呼び出すと、NetBeans ログに次のエラーメッセージが表示されます。

リソースの読み込みに失敗しました: サーバーは 127.0.0.1:8000/test/default/api/entries/2.json で 400 (BAD REQUEST) (10:46:36:182 | エラー、ネットワーク) のステータスで応答しましたリソースの読み込み: Origin localhost:8383 は Access-Control-Allow-Origin で許可されていません。(10:46:36:183 | エラー、ネットワーク) 127.0.0.1:8000/test/default /api/entries/2.json XMLHttpRequest は 127.0.0.1:8000/test/default /api/entries/2 を読み込めません。 json. Origin localhost:8383 は Access-Control-Allow-Origin で許可されていません。(10:46:36:183 | エラー、javascript) www/page/test.html

4

2 に答える 2

0

これは本当に古い質問ですが、まったく同じ問題を解決できました。私の場合、問題はコントローラーにありました。アクションの前に次のラッパーを追加する必要がありました。

def CORS(f):
    """
    Enables CORS for any action
    """
    def wrapper(*args, **kwds):
        if request.env.http_origin and request.env.request_method == 'OPTIONS':
            response.view = 'generic.json'
            return dict()
        return f(*args, **kwds)
    return wrapper

次に、コントローラーにjustyを記述します

@CORS
def whatever():
    do_stuff
    return dict(stuff)
于 2015-04-15T16:02:15.603 に答える