Get IP Address when testing flask application through nosetests
You can set options for the underlying Werkzeug environment using environ_base:
from flask import Flask, requestimport unittestapp = Flask(__name__)app.debug = Trueapp.testing = True@app.route('/')def index(): return str(request.remote_addr)class TestApp(unittest.TestCase): def test_remote_addr(self): c = app.test_client() resp = c.get('/', environ_base={'REMOTE_ADDR': '127.0.0.1'}) self.assertEqual('127.0.0.1', resp.data)if __name__ == '__main__': unittest.main()
A friend gave me this solution, which works across all requests:
class myProxyHack(object): def __init__(self, app): self.app = app def __call__(self, environ, start_response): environ['REMOTE_ADDR'] = environ.get('REMOTE_ADDR', '127.0.0.1') return self.app(environ, start_response)app.wsgi_app = myProxyHack(app.wsgi_app)app.test_client().post(...)
You can also pass a header
param to the test_request_context
if you prefer.
Example:
from flask import Flask, requestimport unittestapp = Flask(__name__)app.debug = Trueapp.testing = True@app.route('/')def index(): return str(request.remote_addr)class TestApp(unittest.TestCase): def test_headers(self): user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0" ip_address = 127.0.0.1 headers = { 'Remote_Addr': ip_address, 'User_Agent': user_agent } with self.test_request_context(headers=headers): # Do something pass
This is useful when you need to perform several unit tests using the request
object in other modules.
See the test_request_context documentation.