【发布时间】:2017-10-21 06:42:23
【问题描述】:
在为我的 Flask 应用程序进行测试时,我偶然发现了一些我不太理解的行为。在我的测试中,我使用Flask documentation 建议的方法从测试中访问和修改session。
假设我有一个非常基本的项目结构:
root
|-- my_app.py
|-- tests
|-- test_my_app.py
my_app.py
from flask import (
Flask,
session,
request
)
app = Flask(__name__)
app.secret_key = 'bad secret key'
@app.route('/action/', methods=['POST'])
def action():
the_action = request.form['action']
if session.get('test'):
return 'Test is set, action complete.'
else:
return 'Oy vey!'
test_my_app.py
import flask
from unittest import TestCase
import my_app
class TestApp(TestCase):
def setUp(self):
self.test_client = my_app.app.test_client()
def testUnsetKeyViaPostNegative(self):
with self.test_client as client:
response = client.post('/action/')
expected_response = 'Oy vey!'.encode('ascii')
self.assertTrue(expected_response == response.data)
现在,如果我运行测试,它将失败,因为响应返回 400 Bad Request。如果the_action = request.form['action'] 被表扬,一切顺利。
我需要它的原因是因为应用程序中有一个逻辑(以及随后的测试),这取决于收到的data(为简洁起见,我省略了)。
我认为将the_action = request.form['action'] 更改为the_action = request.form['action'] or '' 可以解决问题,但它不会。一个简单的解决方法是在 post 请求中添加一些存根 data,就像这样 response = client.post('/action/', data=dict(action='stub'))
在我看来,我错过了一些关于如何从测试中访问和修改会话的重要观点,因此我无法理解所描述的行为。
我想了解的是:
- 为什么只是从请求中获取数据而不添加任何其他逻辑(即行
the_action = request.form['action']导致400 Bad Request响应空POST - 为什么
the_action = request.form['action'] or ''或the_action = request.form['action'] or 'stub'不能解决问题,在我看来好像是空字符串或'stub'是通过POST发送的?
【问题讨论】:
-
也许我遗漏了什么,你在哪里设置你发布的数据?
-
您提到一个简单的解决方法是在发布请求中添加虚拟数据。如果您尝试从 post 请求中提取数据,则需要将数据放入。
-
@chris 我知道为了提取数据,我需要先将其发布,这里让我感到困惑的是 (至少在我看来) 我并没有真正拿出任何东西,只是将值分配给变量(即
the_action = request.form['action'])。由于它不影响action返回逻辑的任何部分(它只是坐在那里),我不明白为什么会返回400 Bad Request。 -
"...问题是 Flask 在 args 和表单字典中找不到键时会引发 HTTP 错误。默认情况下,Flask 假设如果您要求特定键并且它不存在,然后请求中遗漏了某些内容,整个请求无效。”来自this答案
标签: python flask request http-post