Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flask, cannot assign requested address [duplicate]

I'm trying to run a flask app on a remote server, so I can access it from other computers. The server has a public IP and I configured the flask to run on that IP. But when I run the script I get the following traceback

Note: I've removed the public IP from the traceback and my code.

 * Running on **public ip** 
Traceback (most recent call last):
  File "testServer.py", line 14, in <module>
    app.run(host='62.60.19.189',port=5000)
  File "/usr/lib/python2.6/site-packages/flask/app.py", line 772, in run
    run_simple(host, port, self, **options)
  File "/usr/lib/python2.6/site-packages/werkzeug/serving.py", line 710, in run_simple
    inner()
  File "/usr/lib/python2.6/site-packages/werkzeug/serving.py", line 692, in inner
    passthrough_errors, ssl_context).serve_forever()
  File "/usr/lib/python2.6/site-packages/werkzeug/serving.py", line 486, in make_server
    passthrough_errors, ssl_context)
  File "/usr/lib/python2.6/site-packages/werkzeug/serving.py", line 410, in __init__
    HTTPServer.__init__(self, (host, int(port)), handler)
  File "/usr/lib64/python2.6/SocketServer.py", line 402, in __init__
    self.server_bind()
  File "/usr/lib64/python2.6/BaseHTTPServer.py", line 108, in server_bind
    SocketServer.TCPServer.server_bind(self)
  File "/usr/lib64/python2.6/SocketServer.py", line 413, in server_bind
    self.socket.bind(self.server_address)
  File "<string>", line 1, in bind
socket.error: [Errno 99] Cannot assign requested address

Here is my code

import flask

app = flask.Flask("My app")

@app.route('/myroute', methods=['POST'])
def foobar():
        print flask.request.form
        return '<br>'.join('{0}: {1}'.format(*pair) for pair in flask.request.form.items())




if __name__ == '__main__':
    app.run(host='public IP',port=5000)
like image 740
cyberbemon Avatar asked Oct 09 '14 14:10

cyberbemon


2 Answers

You can only directly bind to an IP address that the server has been configured for; behind a router running Network Address Translation (NAT) your internal IP address will be different.

Either bind directly to that internal IP address, or use '0.0.0.0' to listen on all interfaces. You may still need to configure the router to forward a specific port to your internal server.

like image 174
Martijn Pieters Avatar answered Nov 18 '22 15:11

Martijn Pieters


The IP you want to bind a socket to must be directly available on an interface of the machine. This seems not be the case here.

  • If you're behind a NAT: use port-forwarding
  • If you're using a VPN and the VPN adapter of the server is not always up, try using "0.0.0.0" as an address. Beware: It will listen on all interfaces available. Create firewall rules to block access via interfaces you don't want to listen to when using this.
like image 26
dom0 Avatar answered Nov 18 '22 14:11

dom0