为什么我无法使用 add_argument() 将 HTTP Headers 发送到 Flask-RESTful reqparse 模块?
Why am I unable to send HTTP Headers to Flask-RESTful reqparse module using add_argument()?
我正在尝试在我的后端中集成 Flask-RESTful 的请求解析接口 reqparse 以从客户端请求 HTTP headers。目前,我希望将其用于用户身份验证,并希望在 HTTP headers.
中传递 'secret_key'
我用于此任务的函数是 add_argument()
函数。我请求 header 的代码如下:
reqparse = reqparse.RequestParser()
reqparse.add_argument('secret_key', type=str, location='headers', required=True)
但是,在发送以下 cURL 请求时:
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')
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.py
from __init__ import app
app.run(host='0.0.0.0', port=5000, debug=True)
你能告诉我如何解决这个问题吗?我想知道 location
参数是否需要更改,或者我的 cURL 请求是否有问题。
编辑:
在Methika 的回复帮助下,我找到了错误。 add_argument()
函数不在 headers 参数中使用 _
。但是,当我使用 requests.headers['secret_key']
函数时,我可以用 _
字符请求 headers 就好了。为什么会这样?
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
我用你在这里给出的代码做了一些测试,我发现问题不是来自你的代码,而是来自变量的名称:
如果您将 secret_key
替换为 secretkey
(或其他不带下划线的内容),它将起作用!
我发现这个 post,flask 似乎不接受 header 变量名中的下划线。
而不是这个 curl 请求
curl -H "Content-Type: application/json" -H "{secret_key: SECRET}" -X POST -d '{}' http://localhost:5000/authUser
试试这个
curl -H "Content-Type: application/json" -H "secret_key: SECRET" -X POST -d '{}' http://localhost:5000/authUser
在 header 中,我通常看到使用 "Key: Value"
这样的值
我正在尝试在我的后端中集成 Flask-RESTful 的请求解析接口 reqparse 以从客户端请求 HTTP headers。目前,我希望将其用于用户身份验证,并希望在 HTTP headers.
中传递'secret_key'
我用于此任务的函数是 add_argument()
函数。我请求 header 的代码如下:
reqparse = reqparse.RequestParser()
reqparse.add_argument('secret_key', type=str, location='headers', required=True)
但是,在发送以下 cURL 请求时:
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')
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.py
from __init__ import app
app.run(host='0.0.0.0', port=5000, debug=True)
你能告诉我如何解决这个问题吗?我想知道 location
参数是否需要更改,或者我的 cURL 请求是否有问题。
编辑:
在Methika 的回复帮助下,我找到了错误。 add_argument()
函数不在 headers 参数中使用 _
。但是,当我使用 requests.headers['secret_key']
函数时,我可以用 _
字符请求 headers 就好了。为什么会这样?
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
我用你在这里给出的代码做了一些测试,我发现问题不是来自你的代码,而是来自变量的名称:
如果您将 secret_key
替换为 secretkey
(或其他不带下划线的内容),它将起作用!
我发现这个 post,flask 似乎不接受 header 变量名中的下划线。
而不是这个 curl 请求
curl -H "Content-Type: application/json" -H "{secret_key: SECRET}" -X POST -d '{}' http://localhost:5000/authUser
试试这个
curl -H "Content-Type: application/json" -H "secret_key: SECRET" -X POST -d '{}' http://localhost:5000/authUser
在 header 中,我通常看到使用 "Key: Value"
这样的值