为什么我无法使用add_argument()将HTTP标头发送到Flask-RESTful reqparse模块?

Vai*_*jaj 2 python api curl http-headers flask-restful

我正在尝试集成Flask-RESTful的请求解析接口,在我的后端reqparse来请求来自客户端的HTTP头.目前,我希望使用它来验证用户并希望传入'secret_key'HTTP标头.

我用于此任务的add_argument()功能是函数.我请求标题的代码如下:

reqparse = reqparse.RequestParser()
reqparse.add_argument('secret_key', type=str, location='headers', required=True)
Run Code Online (Sandbox Code Playgroud)

但是,在发送以下cURL请求时:

curl -H "Content-Type: application/json" -H "{secret_key: SECRET}" -X POST -d '{}' http://localhost:5000/authUser
Run Code Online (Sandbox Code Playgroud)

我在Pycharm社区版编辑器上收到以下400错误:

127.0.0.1 - - [02/Aug/2016 18:48:59] "POST /authUser HTTP/1.1" 400 -
Run Code Online (Sandbox Code Playgroud)

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

{
  "message": {
    "secret_key": "Missing required parameter in the HTTP headers"
  }
}
Run Code Online (Sandbox Code Playgroud)

要在Pycharm上重现此错误(并希望所有其他编译器也是如此),请使用下面编写的文件,如下所示:

Folder - Sample_App
    - __init__.py
    - run.py
    - views.py
Run Code Online (Sandbox Code Playgroud)

__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')
Run Code Online (Sandbox Code Playgroud)

views.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 Code Online (Sandbox Code Playgroud)

run.py

from __init__ import app

app.run(host='0.0.0.0', port=5000, debug=True)
Run Code Online (Sandbox Code Playgroud)

你能告诉我如何解决这个问题吗?我想知道是否location需要更改参数或者我的cURL请求中是否有错误.

编辑:

在Methika的回应的帮助下,我发现了错误.该add_argument()函数不接受_headers参数.但是,当我使用该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
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 8

我用你在这里给出的代码做了一些测试,我发现问题不是来自你的代码,而是来自变量的名称:

如果要替换secret_keysecretkey(或别的东西,没有下划线),它的工作!

我发现这个帖子,烧瓶似乎不接受标题变量名称中的下划线.