Python Falcon CORS AJAX错误

问题描述:

我已阅读了关于此错误的多个SO问题,但他们都没有帮助我解决此问题。 Falcon服务器甚至没有打印on_post方法的print声明(on_get由于某种原因正常工作),不知道我的on_post方法有什么问题。Python Falcon CORS AJAX错误


我从我的localhost:8000调用一个方法后这样:

#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声明会起作用,但他们不是。

enter image description here

您需要添加的处理程序CORS preflight OPTIONS request浏览器发送,对不对?

服务器必须响应OPTIONS带有200或204,没有响应正文,包括Access-Control-Allow-MethodsAccess-Control-Allow-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选项。

+0

请求是否从'OPTIONS'方法('on_options')直接到'on_post'方法,以便它确实能够达到我的逻辑? – qarthandso

+0

在浏览器发送OPTIONS请求之后,如果它获得了必要的“Access-Control-Allow- *”响应头的预期响应,那么浏览器继续并发送来自客户端代码的POST请求,当你的服务器得到它导致它然后调用你的'on_post'方法 – sideshowbarker