2016-08-03 28 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

过了一段时间,因为我有这个问题:) –

相关问题