2

django-pistonを使用してAPIでPOST/PUT / DELETEクロスドメインリクエストを実行できません。このスクリプトを使用してCORSを有効にしました(これに基づく):

class CORSResource(Resource):
    """
    Piston Resource to enable CORS.
    """

    # headers sent in all responses
    cors_headers = [
        ('Access-Control-Allow-Origin', '*'),
        ('Access-Control-Allow-Headers', 'AUTHORIZATION'),
    ]

    # headers sent in pre-flight responses
    preflight_headers = cors_headers + [
        ('Access-Control-Allow-Methods', '*'),
        ('Access-Control-Allow-Credentials','true')
    ]
    def __init__(self, handler, authentication=None):
        super(CORSResource, self).__init__(handler, authentication)
        self.csrf_exempt = getattr(self.handler, 'csrf_exempt', True)

    def __call__(self, request, *args, **kwargs):

        request_method = request.method.upper()

        # intercept OPTIONS method requests
        if request_method == "OPTIONS":
            # preflight requests don't need a body, just headers
            resp = HttpResponse()

            # add headers to the empty response
            for hk, hv in self.preflight_headers:
                resp[hk] = hv

        else:
            # otherwise, behave as if we called the base Resource
            resp = super(CORSResource, self).__call__(request, *args, **kwargs)

            # slip in the headers after we get the response
            # from the handler
            for hk, hv in self.cors_headers:
                resp[hk] = hv

        return resp

    @property
    def __name__(self):
        return self.__class__.__name__

フロントエンドでは、JSONPをアクティブにしてBackboneを使用しています。エラーはありません。OPTIONSリクエストは正常に機能し、何も起こりません。«Access-Control-Allow-Methods»を変更しようとしましたが、何も変更されません。何か案が ?

編集: OPTIONSリクエストのリクエストヘッダーは次のとおりです。

OPTIONS /api/comments/ HTTP/1.1
Host: apitest.dev:8000
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Origin: http://3l-oauth.dev:1338
Access-Control-Request-Method: POST
Access-Control-Request-Headers: authorization,content-type
Pragma: no-cache
Cache-Control: no-cache

および応答ヘッダー:

HTTP/1.0 200 OK
Date: Sat, 12 May 2012 09:22:56 GMT
Server: WSGIServer/0.1 Python/2.7.3
Access-Control-Allow-Methods: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: AUTHORIZATION
Content-Type: text/html; charset=utf-8
X-Frame-Options: SAMEORIGIN
4

1 に答える 1

2

JSONPはGETのみです:

POST、PUT、またはDELETEリクエストをクロスドメインにすることはできません。クロスドメインJavaScriptは<script>、動的JavaScriptのリクエストをサーバーに送信するタグを使用することで容易になります。スクリプトタグはGETリクエストのみです。

ただし、クロスドメインJavaScriptを処理するときにこの制限に適応するための推奨される方法の1つは、サーバー側のコードで使用するメソッドクエリパラメーターを使用して、特定のリクエストを処理する方法を決定することです。

たとえば、リクエストが

POST /api/comments/

次に、これを行うことができます:

/api/comments?method=POST

内部的には、これはまだGETリクエストですが、APIを少し変更するだけで目標を達成できます。

リクエストのタイプを決定するとき、HTTPメソッドをチェックする代わりに:

if request_method == "OPTIONS":    

代わりに、リクエストパラメータ「method」を確認してください。

 if request.GET["method"] == "OPTIONS":

JSONPリクエストはJavaScriptを返す必要があります:

注意すべきもう1つの非常に重要な点は、JSONPリクエストはすべて関数呼び出しでJavaScriptをラップ(またはパディング)して返す必要があるということです。リクエストはJavaScriptを期待するスクリプトタグによって内部的に行われるため、サーバーはブラウザが理解できるコンテンツを返す必要があります。

これが意味をなさない場合、または詳細情報が必要な場合は、JSONPとスクリプトタグのリモート処理が内部でどのように機能するかについての優れた説明がここにあります

于 2012-05-12T09:29:56.220 に答える