在表单和 json 格式上获取 POST 参数
Getting POST parameters on both, form and json format
我的网络服务应该接收这两种格式的调用:application/x-www-form-urlencoded 和 content-type application/json。
下面的代码适用于表单。但是,它不适用于 json 个。显然我需要为它使用 request.args.get
。
有没有办法修改代码,使同一个方法可以接收这两种格式的调用?
@app.route("/api/<projectTitle>/<path:urlSuffix>", methods=['POST'])
def projectTitlePage(projectTitle, urlSuffix):
apiKey = request.form.get('apikey')
userId = databaseFunctions.getApiKeyUserId(apiKey)
userInfo = databaseFunctions.getUserInfo(userId)
projectId = databaseFunctions.getTitleProjectId(projectTitle)
projectInfo = databaseFunctions.getProjectInfo(projectId)
databaseFunctions.addUserHit(userId, projectId)
databaseFunctions.addProjectHit(userId)
print request.form.to_dict(flat=False)
try:
r = requests.post(projectInfo['secretUrl'], data=request.form.to_dict(flat=False))
except Exception, e:
return '/error=Error'
return r.text
尝试使用 Request.get_json()
获得 JSON;如果失败会引发异常,之后您可以回退到使用 request.form
:
from flask import request
from werkzeug.exceptions import BadRequest
try:
data = request.get_json()
apiKey = data['apikey']
except (TypeError, BadRequest, KeyError):
apiKey = request.form['apikey']
如果mimetype不是application/json
, request.get_json()
returns None
;尝试使用 data['apikey']
然后会导致 TypeError
。 mimetype 是正确的但 JSON 数据无效给你一个 BadRequest
,所有其他无效的 return 值要么导致 KeyError
(没有这样的键)或 TypeError
(对象不支持按名称索引)。
另一种选择是测试 request.mimetype
attribute:
if request.mimetype == 'application/json':
data = request.get_json()
apiKey = data['apiKey']
else:
apiKey = request.form['apikey']
无论哪种方式,如果没有有效的 JSON 数据或表单数据被发布但没有 apikey
条目或不相关的 mimetype 被发布,一个 BadRequest
异常将是引发并向客户端 return 发送 400 响应。
我不是特别熟悉 Flask,但根据他们的文档,您应该能够做类似
的事情
content = request.headers['CONTENT-TYPE']
if content[:16] == 'application/json':
# Process json
else:
# Process as form-encoded
我获取 json
和 form-data
而不管 header 的方法就像
data = request.get_json() or request.form
key = data.get('key')
我的网络服务应该接收这两种格式的调用:application/x-www-form-urlencoded 和 content-type application/json。
下面的代码适用于表单。但是,它不适用于 json 个。显然我需要为它使用 request.args.get
。
有没有办法修改代码,使同一个方法可以接收这两种格式的调用?
@app.route("/api/<projectTitle>/<path:urlSuffix>", methods=['POST'])
def projectTitlePage(projectTitle, urlSuffix):
apiKey = request.form.get('apikey')
userId = databaseFunctions.getApiKeyUserId(apiKey)
userInfo = databaseFunctions.getUserInfo(userId)
projectId = databaseFunctions.getTitleProjectId(projectTitle)
projectInfo = databaseFunctions.getProjectInfo(projectId)
databaseFunctions.addUserHit(userId, projectId)
databaseFunctions.addProjectHit(userId)
print request.form.to_dict(flat=False)
try:
r = requests.post(projectInfo['secretUrl'], data=request.form.to_dict(flat=False))
except Exception, e:
return '/error=Error'
return r.text
尝试使用 Request.get_json()
获得 JSON;如果失败会引发异常,之后您可以回退到使用 request.form
:
from flask import request
from werkzeug.exceptions import BadRequest
try:
data = request.get_json()
apiKey = data['apikey']
except (TypeError, BadRequest, KeyError):
apiKey = request.form['apikey']
如果mimetype不是application/json
, request.get_json()
returns None
;尝试使用 data['apikey']
然后会导致 TypeError
。 mimetype 是正确的但 JSON 数据无效给你一个 BadRequest
,所有其他无效的 return 值要么导致 KeyError
(没有这样的键)或 TypeError
(对象不支持按名称索引)。
另一种选择是测试 request.mimetype
attribute:
if request.mimetype == 'application/json':
data = request.get_json()
apiKey = data['apiKey']
else:
apiKey = request.form['apikey']
无论哪种方式,如果没有有效的 JSON 数据或表单数据被发布但没有 apikey
条目或不相关的 mimetype 被发布,一个 BadRequest
异常将是引发并向客户端 return 发送 400 响应。
我不是特别熟悉 Flask,但根据他们的文档,您应该能够做类似
的事情content = request.headers['CONTENT-TYPE']
if content[:16] == 'application/json':
# Process json
else:
# Process as form-encoded
我获取 json
和 form-data
而不管 header 的方法就像
data = request.get_json() or request.form
key = data.get('key')