【问题标题】:Python Falcon CORS Error with AJAXPython Falcon CORS 错误与 AJAX
【发布时间】:2017-12-24 03:24:36
【问题描述】:

我已阅读有关此错误的多个 SO 问题,但似乎都没有帮助我解决此问题。 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 语句会起作用,但事实并非如此。

【问题讨论】:

    标签: python ajax cors axios falconframework


    【解决方案1】:

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

    服务器必须以 200 或 204 响应 OPTIONS,并且没有响应正文,并包含 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 选项。

    【讨论】:

    • 请求是否从 OPTIONS 方法 (on_options) 直接转到 on_post 方法,以便它实际上符合我的逻辑?
    • 在浏览器发送OPTIONS请求后,如果它获得了带有必要的Access-Control-Allow-*响应头的预期响应,那么浏览器继续并从您的客户端代码发送POST请求,当你的服务器得到它时,它会调用你的 on_post 方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2021-11-10
    • 2015-05-02
    • 2017-12-23
    相关资源
    最近更新 更多