2016-08-03 93 views
2

我正在嘗試將Flask-RESTful的請求解析接口reqparse集成到我的後端,以便從客戶端請求HTTP頭。目前,我希望使用它來驗證用戶,並希望在HTTP標頭中傳遞'secret_key'爲什麼我無法使用add_argument()將HTTP Headers發送到Flask-RESTful reqparse模塊?

我用於此任務的功能是add_argument()函數。我請求頭部代碼如下:

reqparse = reqparse.RequestParser() 
reqparse.add_argument('secret_key', type=str, location='headers', required=True) 

然而,在發送以下捲曲要求:

curl -H "Content-Type: application/json" -H "{secret_key: SECRET}" -X POST -d '{}' http://localhost:5000/authUser 

我收到我的Pycharm社區版的編輯以下400錯誤:

127.0.0.1 - - [02/Aug/2016 18:48:59] "POST /authUser HTTP/1.1" 400 - 

以及我的cURL終端上的以下消息:

{ 
    "message": { 
    "secret_key": "Missing required parameter in the HTTP headers" 
    } 
} 

要重現上Pycharm此錯誤(並希望所有其他的編譯器也一樣),請使用下面寫如下的文件:

Folder - Sample_App 
    - __init__.py 
    - run.py 
    - views.py 

__init__.py

from flask import Flask 
from flask_restful import Api 
from views import AuthUser 

app = Flask(__name__) 

api = Api(app) 
api.add_resource(AuthUser, '/authUser') 

意見。 py

from flask_restful import reqparse, Resource 

class AuthUser(Resource): 

    def __init__(self): 
     self.reqparse = reqparse.RequestParser() 
     self.reqparse.add_argument('secret_key', type=str, location='headers', required=True) 

    def post(self): 
     data = self.reqparse.parse_args() 
     if data['secret_key'] == "SECRET": 
      print("Success") 
      return 200 
     return 400 

run.py

from __init__ import app 

app.run(host='0.0.0.0', port=5000, debug=True) 

你能告訴我如何解決這個問題?我想知道是否需要更改location參數或者我的cURL請求中有什麼問題。

編輯:

隨着Methika響應的幫助下,我已經想通了錯誤。 add_argument()函數在頭參數中不佔用_。但是,當我使用requests.headers['secret_key']函數時,我能夠請求包含_字符的標頭。爲什麼會這樣?

views.py新代碼:

views.py

from flask_restful import reqparse, Resource 

class AuthUser(Resource): 

    def __init__(self): 
     self.reqparse = reqparse.RequestParser() 

    def post(self): 
     data = self.reqparse.parse_args() 
     data['secret_key'] = request.headers['secret_key'] 
     if data['secret_key'] == "SECRET": 
      print("Success") 
      return 200 
     return 400 

回答

4

我做了一些測試,與你在這裏給我發現,這個問題不來的代碼從你的代碼,但從變量的名稱:

如果您將secret_keysecretkey(或別的沒有下劃線的東西),它會w ork!

我發現這個post,燒瓶似乎不接受標頭變量名中的下劃線。

+0

我不敢苟同。如果我使用'request.headers ['secret_key']'做出相同的請求,它就可以正常工作。例如:在post函數中,使用'data ['secret_key'] = request.headers ['secret_key']'。它的工作原理,但我希望使用此功能。但我會檢查你的解決方案。 –

+0

您的解決方案有效,但我不喜歡這種推理,因爲我可以使用'request.headers ['secret_key']'發出請求。這是爲什麼? –

+1

不用擔心,我在這裏找到了我的問題的答案:https://github.com/kennethreitz/requests/issues/1292 –

1

代替這種捲曲請求

curl -H "Content-Type: application/json" -H "{secret_key: SECRET}" -X POST -d '{}' http://localhost:5000/authUser 

的嘗試這一個

​​

在報頭通常我看到使用像值「鍵:值」

+0

過了一段時間,因爲我有這個問題:) –