2017-07-19 3 views
0

このエラーで複数の質問がありましたが、この問題を解決するのに役立つものはありません。 Falconサーバーはon_postメソッドのprintステートメントを印刷していません(on_getはなんらかの理由で正常に動作しています)。on_postメソッドの何が問題なのかよくわかりません。Python Falcon CORS Ajaxでエラーが発生しました


私のような私の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ステートメントが動作すると仮定していただろうが、そうではない。

enter image description here

答えて

1

は、あなたは正しい、ブラウザが送信するCORS preflight OPTIONS requestのためのハンドラを追加する必要がありますか?

OPTIONSに応答するサーバーは、レスポンスヘッダーがAccess-Control-Allow-MethodsおよびAccess-Control-Allow-Headersで、レスポンスボディが200または204で、レスポンスヘッダーがありません。

したがって、このような何か:

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 

...その後に既存のコードを変更:またallow_credentials_all_origins=Trueオプションを設定する必要があるかもしれません

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) 

+0

リクエストは 'OPTIONS'メソッド(' on_options')から 'on_post'メソッドに直接渡されるので、実際に自分のロジックに入りますか? – qarthandso

+0

ブラウザが 'OPTIONS'リクエストを送信した後、必要な' Access-Control-Allow- * 'レスポンスヘッダを持つ期待されるレスポンスを受け取ると、ブラウザは先に進み、クライアントコードから' POST'リクエストを送ります。あなたのサーバがそれを取得すると、 'on_post'メソッドが呼び出されます – sideshowbarker

関連する問題