Python Falcon CORS 错误 AJAX
Python Falcon CORS Error with AJAX
我已经阅读了多个关于此错误的 SO 问题,但其中 none 似乎在帮助我解决此问题。 Falcon 服务器甚至没有打印出 on_post
方法的 print
语句(on_get
由于某种原因工作正常),不确定我的 on_post
方法有什么问题.
我正在从我的 localhost:8000
中调用一个 post 方法:
#client side
var ax = axios.create({
baseURL: 'http://localhost:5000/api/',
timeout: 2000,
headers: {}
});
ax.post('/contacts', {
firstName: 'Kelly',
lastName: 'Rowland',
zipCode: '88293'
}).then(function(data) {
console.log(data.data);
}).catch(function(err){
console.log('This is the catch statement');
});
这是猎鹰服务器代码
import falcon
from peewee import *
#declare resources and instantiate it
class ContactsResource(object):
def on_get(self, req, res):
res.status = falcon.HTTP_200
res.body = ('This is me, Falcon, serving a resource HEY ALL!')
res.set_header('Access-Control-Allow-Origin', '*')
def on_post(self, req, res):
res.set_header('Access-Control-Allow-Origin', '*')
print('hey everyone')
print(req.context)
res.status = falcon.HTTP_201
res.body = ('posted up')
contacts_resource = ContactsResource()
app = falcon.API()
app.add_route('/api/contacts', contacts_resource)
我想我在我的 on_post
方法中犯了一个小错误,但我不知道是什么。我本以为至少 print
语句会起作用,但它们不起作用。
您需要为浏览器发送的 CORS preflight OPTIONS
request 添加处理程序,对吗?
服务器必须用 200 或 204 响应 OPTIONS
并且没有响应 body 并包含 Access-Control-Allow-Methods
和 Access-Control-Allow-Headers
响应 headers。
所以像这样:
def on_options(self, req, res):
res.status = falcon.HTTP_200
res.set_header('Access-Control-Allow-Origin', '*')
res.set_header('Access-Control-Allow-Methods', 'POST')
res.set_header('Access-Control-Allow-Headers', 'Content-Type')
将 Access-Control-Allow-Headers
值调整为您实际需要的值。
或者您可以使用 falcon-cors
包:
pip install falcon-cors
…然后将您现有的代码更改为:
from falcon_cors import CORS
cors_allow_all = CORS(allow_all_origins=True,
allow_all_headers=True,
allow_all_methods=True)
api = falcon.API(middleware=[cors.middleware])
#declare resources and instantiate it
class ContactsResource(object):
cors = cors_allow_all
def on_get(self, req, res):
res.status = falcon.HTTP_200
res.body = ('This is me, Falcon, serving a resource HEY ALL!')
def on_post(self, req, res):
print('hey everyone')
print(req.context)
res.status = falcon.HTTP_201
res.body = ('posted up')
contacts_resource = ContactsResource()
app = falcon.API()
app.add_route('/api/contacts', contacts_resource)
您可能还需要设置 allow_credentials_all_origins=True
选项。
我已经阅读了多个关于此错误的 SO 问题,但其中 none 似乎在帮助我解决此问题。 Falcon 服务器甚至没有打印出 on_post
方法的 print
语句(on_get
由于某种原因工作正常),不确定我的 on_post
方法有什么问题.
我正在从我的 localhost:8000
中调用一个 post 方法:
#client side
var ax = axios.create({
baseURL: 'http://localhost:5000/api/',
timeout: 2000,
headers: {}
});
ax.post('/contacts', {
firstName: 'Kelly',
lastName: 'Rowland',
zipCode: '88293'
}).then(function(data) {
console.log(data.data);
}).catch(function(err){
console.log('This is the catch statement');
});
这是猎鹰服务器代码
import falcon
from peewee import *
#declare resources and instantiate it
class ContactsResource(object):
def on_get(self, req, res):
res.status = falcon.HTTP_200
res.body = ('This is me, Falcon, serving a resource HEY ALL!')
res.set_header('Access-Control-Allow-Origin', '*')
def on_post(self, req, res):
res.set_header('Access-Control-Allow-Origin', '*')
print('hey everyone')
print(req.context)
res.status = falcon.HTTP_201
res.body = ('posted up')
contacts_resource = ContactsResource()
app = falcon.API()
app.add_route('/api/contacts', contacts_resource)
我想我在我的 on_post
方法中犯了一个小错误,但我不知道是什么。我本以为至少 print
语句会起作用,但它们不起作用。
您需要为浏览器发送的 CORS preflight OPTIONS
request 添加处理程序,对吗?
服务器必须用 200 或 204 响应 OPTIONS
并且没有响应 body 并包含 Access-Control-Allow-Methods
和 Access-Control-Allow-Headers
响应 headers。
所以像这样:
def on_options(self, req, res):
res.status = falcon.HTTP_200
res.set_header('Access-Control-Allow-Origin', '*')
res.set_header('Access-Control-Allow-Methods', 'POST')
res.set_header('Access-Control-Allow-Headers', 'Content-Type')
将 Access-Control-Allow-Headers
值调整为您实际需要的值。
或者您可以使用 falcon-cors
包:
pip install falcon-cors
…然后将您现有的代码更改为:
from falcon_cors import CORS
cors_allow_all = CORS(allow_all_origins=True,
allow_all_headers=True,
allow_all_methods=True)
api = falcon.API(middleware=[cors.middleware])
#declare resources and instantiate it
class ContactsResource(object):
cors = cors_allow_all
def on_get(self, req, res):
res.status = falcon.HTTP_200
res.body = ('This is me, Falcon, serving a resource HEY ALL!')
def on_post(self, req, res):
print('hey everyone')
print(req.context)
res.status = falcon.HTTP_201
res.body = ('posted up')
contacts_resource = ContactsResource()
app = falcon.API()
app.add_route('/api/contacts', contacts_resource)
您可能还需要设置 allow_credentials_all_origins=True
选项。