首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有角度的RESTful跨域问题:放置,选择方法

有角度的RESTful跨域问题:放置,选择方法
EN

Stack Overflow用户
提问于 2013-11-13 19:31:03
回答 8查看 60.9K关注 0票数 49

我已经开发了一个小型的只写的REST api,它可以接受少数几个可能会改变IP地址的客户端的PUT请求。我的客户端是运行AngularJS前端的嵌入式Chromium客户端;他们使用我的API使用一个简单的神奇密钥进行身份验证--对于我非常有限的规模来说,这就足够了。

我正在测试如何部署我的API,并且我注意到这些角度的客户端正在尝试向我的Flask服务发送一个选项http方法。同时,我的API使用了404 (因为我还没有编写选项处理程序,只有PUT处理程序)。似乎在发送非POST或GET的跨域请求时,角将在服务器上发送一种飞行前选项方法,以确保在发送实际请求之前跨域请求被接受。是那么回事吗?

无论如何,我如何允许所有跨域的PUT请求到?我以前使用过带有(非restful) Flask实例的跨域装饰器,但是否需要将选项处理程序也写入我的API?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-11-14 15:24:16

我解决了这个问题,在我的PUT响应中重写了我的烧瓶后端,以一个访问控制允许起始头来回答这个问题。此外,我在我的Flask应用程序中创建了一个选项处理程序,通过遵循我在http中看到的内容来回答OPTIONS方法。

PUT方法的返回如下所示:

代码语言:javascript
复制
return restful.request.form, 201, {'Access-Control-Allow-Origin': '*'} 

我的OPTIONS方法处理程序如下所示:

代码语言:javascript
复制
def options (self):
    return {'Allow' : 'PUT' }, 200, \
    { 'Access-Control-Allow-Origin': '*', \
      'Access-Control-Allow-Methods' : 'PUT,GET' }

@tbicr是对的:烧瓶会自动为您回答选项方法。然而,在我的例子中,它并没有发送带有这个答案的访问控制-允许-原产地报头,所以我的浏览器得到了api的答复,这似乎意味着不允许跨域请求。在我的情况下,我重载了选项请求,并添加了ACAO头,浏览器似乎对此感到满意,并在选项之后添加了一个PUT。

票数 21
EN

Stack Overflow用户

发布于 2014-12-11 13:23:16

使用烧瓶模块,您可以在不更改代码的情况下执行跨域请求

代码语言:javascript
复制
from flask.ext.cors import CORS

app = Flask(__name__)
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})

更新

正如flask.ext.cors建议的那样,现在不推荐使用埃里克模块,您应该使用以下代码:

代码语言:javascript
复制
from flask_cors import CORS

app = Flask(__name__)
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})
票数 62
EN

Stack Overflow用户

发布于 2016-06-09 19:34:11

这个解决办法怎么样:

代码语言:javascript
复制
from flask import Flask
from flask.ext import restful
from flask.ext.restful import Api
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config.from_object('config')

#flask-sqlalchemy
db = SQLAlchemy(app)

#flask-restful
api = restful.Api(app)

@app.after_request

def after_request(response):
  response.headers.add('Access-Control-Allow-Origin', '*')
  response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
  response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE')
  return response

import views

我从教程中学到了这个。效果很好。事实上,我认为这是我见过的最好的方法。

在每个端点上返回{'Access-Control-Allow-Origin': '*'}似乎并不有效,因为您必须在每个端点上添加它。有点沾沾自喜.至少对我来说。

我尝试过@cors.crossdomain(origin='*'),但是看起来它只适用于GET请求。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19962699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档