2

POST、PUT、および GET が正常に機能しているのに、DELETE リクエストが送信されない理由がわかりません。そして、CORS が機能するために必要なすべてのビット構成を既に行っていると確信しています。AngularJS と Flask-CORS 拡張機能を使用しています

そして、これが私の現在の仕事です:

角度構成:

angular.module('...' [...]).config(function($httpProvider) {
  $httpProvider.defaults.useXDomain = true;
  delete $httpProvider.defaults.headers.common['X-Requested-With'];
});

角工場:

angular.module('...').factory('...'), function($http) {
  return {
    deleteElectronicAddress: function (partyId, contactMechanismId) {
      return $http({
        url: urlBase + 'party/' + partyId + '/contact-mechanism/' + contactMechanismId,
        method: 'DELETE',
      });
    },

    someMoreMethods: { ... }
  }
}

My Flask コード (私は、Miguel Grinberg が著書 Flask Web Development で提案したアプリ構造を使用しています)

config.py

class Config:
    ...

    CORS_HEADERS = 'Content-Type'
    CORS_RESOURCES = {r"/api/*": {"origins": "*"}}
    CORS_METHODS = ['GET', 'POST', 'DELETE', 'PUT', 'OPTIONS', 'HEAD']

    ...

project_folder/app/__init__.py:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.cors import CORS
from config import config

db = SQLAlchemy()


def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    db.init_app(app)
    CORS(app)

    from .api_1_0 import api as api_1_0_blueprint
    app.register_blueprint(api_1_0_blueprint, url_prefix='/api/v1.0')

    return app

現在、Flask-CORS v1.7.4 を使用しています。

project_folder/app/api/party_contact_mechanisms.py:

from datetime import date
from flask import jsonify
from .. import db
from ..models import PartyContactMechanism
from . import api

@api.route(
'/party/<int:party_id>' +
'/contact-mechanism/<int:contact_mechanism>', methods=['DELETE'])
def unlink_party_contact_mechanism(party_id, contact_mechanism):
"""Unlink the contact mechanism onto the party."""
     party_contact = PartyContactMechanism.query \
        .filter_by(party_id=party_id) \
        .filter_by(contact_mechanism_id=contact_mechanism) \
        .first()

     party_contact.thru_date = str(date.today())

     db.session.commit()

     return jsonify(success=True)

ローカル マシンと LAN に接続された別のマシンの両方で httpie を使用して既にこれをテストしましたが、問題なく動作します。

ネットワークに接続されている他のマシンでアクセスできるように、0.0.0.0 ホスト構成で角度とフラスコの両方を実行しています。

ブラウザから呼び出したときのリクエストヘッダーとレスポンスヘッダーは次のとおりです

リクエストヘッダー:

OPTIONS /api/v1.0/party/32232/contact-mechanism/80667 HTTP/1.1
Host: 10.61.18.217:5000
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:31.0) Gecko/20100101      Firefox/31.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
Origin: http://0.0.0.0:9000
Access-Control-Request-Method: DELETE
Connection: keep-alive

応答ヘッダー:

HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Allow: POST, OPTIONS, DELETE
access-control-allow-origin: *
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: Content-Type
Content-Length: 0
Server: Werkzeug/0.9.6 Python/2.7.6
Date: Mon, 18 Aug 2014 07:20:18 GMT

httpie から呼び出した場合のリクエスト ヘッダーとレスポンス ヘッダーは次のとおりです。

リクエストヘッダー:

DELETE /api/v1.0/party/32232/contact-mechanism/80667 HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate, compress
Content-Length: 0
Host: 10.61.18.217:5000
User-Agent: HTTPie/0.8.0

応答ヘッダー:

HTTP/1.0 200 OK
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: DELETE, GET, HEAD, OPTIONS, POST, PUT
Access-Control-Allow-Origin: *
Content-Length: 21
Content-Type: application/json
Date: Mon, 18 Aug 2014 07:31:05 GMT
Server: Werkzeug/0.9.6 Python/2.7.6

{
   "success": true
}
4

1 に答える 1

2

私は今、私が間違っていたことを理解しました。

実際には、ファイルには別のルートがありproject_folder/app/api/party_contact_mechanisms.py、サンプルに追加する必要はありませんでした。

ここにあります:

@api.route(
'/party/<int:party_id>' +
'/contact-mechanism/<int:contact_mechanism>',
methods=['POST'])
@cross_origin(methods=['POST'])
def link_party_contact_mechanism(party_id, contact_mechanism):
"""Link the contact mechanism onto the party."""
    party_contact = PartyContactMechanism(
        party_id=party_id, contact_mechanism=contact_mechanism,
        from_date=str(date.today()), thru_date=None
    )

    db.session.add(party_contact)
    db.session.commit()

    return jsonify({})

ご覧のとおり、ルート ルールは同じですが、メソッドが異なります。ここでは POST です。

そして、Flask-CORS v1.7 を使用する前は、v1.3 を使用していました。これは@cross_origin、ルート CORS を有効にする唯一の方法であるため、デコレータを説明しています (または、すべてのルートでそれを使用する場合は、 に配置しますbefore_request) 。

私が新しいバージョンで見逃していたのは、はい、私の で行ったのと同じように、アプリ全体を初期化することで CORS を有効にすることproject_folder/app/__init__.pyができるということです。はい、「@cross_origin」を介して特定のルートを実行できますが、 、それはグローバル構成を上書きします。私の場合、同じルールでメソッドが異なる2つのルートがあり、 @cross_origin デコレーターを持つルートは1つだけであり、それが問題の根本です。

削除したばかりで、今は問題なく動作しています。@cross_origin他のルートに別のデコレータを追加しても修正されないことに注意してください。最初に出現したものだけを読み取るようです。

于 2014-08-18T10:11:02.377 に答える