Reputation: 3937
I have a Flask server running through port 5000, and it's fine. I can access it at http://example.com:5000
But is it possible to simply access it at http://example.com? I'm assuming that means I have to change the port from 5000 to 80. But when I try that on Flask, I get this error message when I run it.
Traceback (most recent call last):
File "xxxxxx.py", line 31, in <module>
app.run(host="0.0.0.0", port=int("80"), debug=True)
File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 772, in run
run_simple(host, port, self, **options)
File "/usr/local/lib/python2.6/dist-packages/werkzeug/serving.py", line 706, in run_simple
test_socket.bind((hostname, port))
File "<string>", line 1, in bind
socket.error: [Errno 98] Address already in use
Running lsof -i :80
returns
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
apache2 467 root 3u IPv4 92108840 0t0 TCP *:www (LISTEN)
apache2 4413 www-data 3u IPv4 92108840 0t0 TCP *:www (LISTEN)
apache2 14346 www-data 3u IPv4 92108840 0t0 TCP *:www (LISTEN)
apache2 14570 www-data 3u IPv4 92108840 0t0 TCP *:www (LISTEN)
apache2 14571 www-data 3u IPv4 92108840 0t0 TCP *:www (LISTEN)
apache2 14573 www-data 3u IPv4 92108840 0t0 TCP *:www (LISTEN)
Do I need to kill these processes first? Is that safe? Or is there another way to keep Flask running on port 5000 but have the main website domain redirect somehow?
Upvotes: 353
Views: 763614
Reputation: 1617
I solved 2 times and solved it with 2 solution
The first solution, follow these steps:
1 open cmd
2 run ipconfig
at cmd
3 copy IPv4 Address from cmd
4 Use your IPv4 as the local host in the next:
app.run(debug=True, port=5000, host='localhost')
at replace 'localhost' with your IPv4 Address
5 for your front end, do the same of step 4 like:
at 'http://localhost:5000/auth' replace 'localhost' with your IPv4 Address
Note: use the same port for {the frontend, and the backend}
6 run your both projects together(the backend and the frontend)
The second time, the last solution didn't work, and I solved it with this:
app.run(debug=True, port=8000, host='localhost')
Upvotes: 1
Reputation: 547
you can easily disable any process running on port 80 and then run this command
flask run --host 0.0.0.0 --port 80
or if u prefer running it within the .py file
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
Upvotes: 24
Reputation: 6098
This is the only solution that worked for me on Ubuntu-18.
Inside the file app.py
, use:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
The code above will give the same permission error unless sudo
is used to run it:
sudo python3 app.py
Upvotes: 33
Reputation: 862
On my scenario the following steps worked like a charm:
Installing the package:
pip install --upgrade pip
pip install python-dotenv
Creating a hidden file in my app directory "flaskr/.flaskenv"
Adding the following content:
FLASK_APP=flaskr
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=8000
Finally, run the flask command one more time:
flask run
The version which I am working on is:
pip freeze |grep -i flask
Flask==1.1.1
Upvotes: 13
Reputation: 533
A convinient way is using the package python-dotenv
:
It reads out a .flaskenv
file where you can store environment variables for flask.
pip install python-dotenv
.flaskenv
in the root directory of your appInside the file you specify:
FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80
After that you just have to run your app with flask run
and can access your app at that port.
Please note that FLASK_RUN_HOST
defaults to 127.0.0.1
and FLASK_RUN_PORT
defaults to 5000
.
Upvotes: 46
Reputation: 1455
I had to set FLASK_RUN_PORT
in my environment to the specified port number. Next time you start your app, Flask will load that environment variable with the port number you selected.
Upvotes: 13
Reputation: 2141
Easiest and Best Solution
Save your .py file in a folder. This case my folder name is test. In the command prompt run the following
c:\test> set FLASK_APP=application.py
c:\test> set FLASK_RUN_PORT=8000
c:\test> flask run
----------------- Following will be returned ----------------
* Serving Flask app "application.py"
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
127.0.0.1 - - [23/Aug/2019 09:40:04] "[37mGET / HTTP/1.1[0m" 200 -
127.0.0.1 - - [23/Aug/2019 09:40:04] "[33mGET /favicon.ico HTTP/1.1[0m" 404 -
Now on your browser type: http://127.0.0.1:8000. Thanks
Upvotes: 4
Reputation: 131
If you want your application on same port i.e port=5000 then just in your terminal run this command:
fuser -k 5000/tcp
and then run:
python app.py
If you want to run on a specified port, e.g. if you want to run on port=80, in your main file just mention this:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
Upvotes: 13
Reputation: 457
set the port with app.run(port=80,debug=True)
you should set debug to true when on dev
Upvotes: 6
Reputation: 997
If you use the following to change the port or host:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
use the following code to start the server (my main entrance for flask is app.py):
python app.py
instead of using:
flask run
Upvotes: 48
Reputation: 3478
For externally visible server, where you don't use apache or other web server you just type
flask run --host=0.0.0.0 --port=80
Upvotes: 261
Reputation: 15058
So it's throwing up that error message because you have apache2
running on port 80.
If this is for development, I would just leave it as it is on port 5000.
If it's for production either:
Not Recommended
apache2
first; Not recommended as it states in the documentation:
You can use the builtin server during development, but you should use a full deployment option for production applications. (Do not use the builtin development server in production.)
Recommended
HTTP
traffic through apache2
to Flask.This way, apache2
can handle all your static files (which it's very good at - much better than the debug server built into Flask) and act as a reverse proxy for your dynamic content, passing those requests to Flask.
Here's a link to the official documentation about setting up Flask with Apache + mod_wsgi.
Edit 1 - Clarification for @Djack
Proxy HTTP traffic to Flask through apache2
When a request comes to the server on port 80 (HTTP
) or port 443 (HTTPS
) a web server like Apache or Nginx handles the connection of the request and works out what to do with it. In our case a request received should be configured to be passed through to Flask on the WSGI protocol and handled by the Python code. This is the "dynamic" part.
reverse proxy for dynamic content
There are a few advantages to configuring your web server like the above;
Upvotes: 102
Reputation: 7043
1- Stop other applications that are using port 80. 2- run application with port 80 :
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
Upvotes: 589
Reputation: 9696
Your issue is, that you have an apache webserver already running that is already using port 80. So, you can either:
Kill apache: You should probably do this via /etc/init.d/apache2 stop
, rather than simply killing them.
Deploy your flask app in your apache process, as flask in apache describes.
Upvotes: 8
Reputation: 1416
You don't need to change port number for your application, just configure your www server (nginx or apache) to proxy queries to flask port. Pay attantion on uWSGI
.
Upvotes: 7