我问了一个相关的问题here。基本上,我有一个用Flask构建的API,我希望能够从运行Flask应用程序本身的同一台机器上POST。所有其他POST请求应得到401 Unauthorized的响应。
我对如何实现这一点感到有点困惑。在SO的其他地方(我不记得在哪里)我读到比较REMOTE_ADDR标头/字段是正确的方法来做到这一点。 Here至少是一个例子。
我写了一些代码,我认为会在视图函数中执行此操作:
if request.environ.get('REMOTE_ADDR', '127.0.0.1') != '127.0.0.1':
abort(401)
post_data = request.form
DPC().store(post_data)
return jsonify(post_data), 201
但是,在实施这些更改后,我仍然可以从外部计算机POST到API。我为此功能编写的测试掩盖了可能存在的潜在问题: def test_external_post_fails(self):
my_data = {
...
}
result = self.client.post('/daily_population_changes',
data=my_data,
environ_overrides={'REMOTE_ADDR': '127.0.0.2'})
assert result.status_code == 401
测试成功。但问题是准确性,而不是精确度:我在这里测试正确的东西吗?远程请求是否实际上Werkzeug environment中的REMOTE_ADDR的(非空)值不等于'127.0.0.1'?
我还没有能够像我想要的那样对这些请求对象进行实际检查,除了(在生产服务器上)看到POST白名单没有成功。也许有人已经深入了解这一点,否则我将有机会获得更多的机器。
谢谢!
答案 0 :(得分:1)
可能绊倒你的一件事是使用request.environ.get('REMOTE_ADDR', '127.0.0.1')
。如果第一个键不存在,get()
的{{1}}方法将返回第二个值。因此,如果没有dict
,无论出于何种原因,它都会自动填入'REMOTE_ADDR'
。
尝试类似:
'127.0.0.1'
代替。这有帮助吗?