我很困惑,我不明白为什么当POST、PUT和GET工作正常时,DELETE请求没有通过。我很确定我已经做了CORS工作所需的每一个配置。我使用的是AngularJS和Flask-CORS扩展
这是我目前的工作:
Angular 配置:
angular.module('...' [...]).config(function($httpProvider) {
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
});
Angular 工厂:
angular.module('...').factory('...'), function($http) {
return {
deleteElectronicAddress: function (partyId, contactMechanismId) {
return $http({
url: urlBase + 'party/' + partyId + '/contact-mechanism/' + contactMechanismId,
method: 'DELETE',
});
},
someMoreMethods: { ... }
}
}
我的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']
...
项目文件夹/应用程序/初始化.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。
项目文件夹/应用程序/API/参与方联系机制.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)
我已经用httpie测试过了,既在我的本地机器上,也在另一台连接到局域网的机器上,效果都很好。
我运行的Angular 和 flask 与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
}
1条答案
按热度按时间2lpgd9681#
我知道我做错了什么
实际上,在我的
project_folder/app/api/party_contact_mechanisms.py
文件中有另一条路径,我没有麻烦添加到我的示例中,因为我认为它无关紧要(我认为是错误的)这就是:
如您所见,它具有相同的路由规则,但方法不同,在这里是POST。
在使用Flask-CORS v1.7之前,我使用的是v1.3,这解释了
@cross_origin
装饰器,因为这是启用路线CORS的唯一方法(或者,如果您希望在所有路线上启用它,则将其放在before_request
上)我错过了新版本的事情是,是的,你现在可以通过初始化它来启用你的整个应用CORS,就像我在我的
project_folder/app/__init__.py
上所做的那样,是的,你仍然可以通过'@cross_origin '来做特定的路线,但当你这样做时,它会覆盖全局配置,在我的例子中,我有两个路由,它们有相同的规则但是不同的方法,并且只有一个有@cross_origin装饰器,这就是问题的根源。我刚刚删除了它,它现在工作得很好。请注意,在您的其他路线上添加另一个
@cross_origin
装饰器不会修复它,它似乎只读取它的第一次出现。