The lines that the user needs to enter or customize will be highlighed in this tutorial! The rest should mostly be copy-and-pastable.
Flask is a micro-framework written in Python and based on the Werkzeug and Jinja2 template engine for developing web applications. It is intended for developing web apps quickly.
You need to have Apache already installed and running on your VPS. If this is not the case, follow Step One of our article on installing a LAMP stack on Ubuntu.
WSGI (Web Server Gateway Interface) is an interface between web servers and web apps for python. Mod_wsgi is an Apache HTTP server mod that enables Apache to serve Flask applications.
Open terminal and type the following command to install mod_wsgi:
sudo apt-get install libapache2-mod-wsgi python-dev
To enable mod_wsgi, run the following command:
sudo a2enmod wsgi
In this step, we will create a flask app. We will place our app in the /var/www directory.
Use the following command to move to the /var/www directory:
cd /var/www
Create the application directory structure using mkdir as shown. Replace "FlaskApp" with the name you would like to give your application. Create the initial directory FlaskApp by giving following command:
sudo mkdir FlaskApp
Move inside this directory using the following command:
cd FlaskApp
Create another directory FlaskApp by giving following command:
sudo mkdir FlaskApp
Then, move inside this directory and create two subdirectories named static and templates using the following commands:
cd FlaskApp
sudo mkdir static templates
Your directory structure should now look like this:
|----FlaskApp |---------FlaskApp |--------------static |--------------templates
Now, create the __init__.py file that will contain the flask application logic.
sudo nano __init__.py
Add following logic to the file:
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello, I love Digital Ocean!" if __name__ == "__main__": app.run()
Save and close the file.
Setting up a virtual environment will keep the application and its dependencies isolated from the main system. Changes to it will not affect the cloud server's system configurations.
In this step, we will create a virtual environment for our flask application.
We will use pip to install virtualenv and Flask. If pip is not installed, install it on Ubuntu through apt-get.
sudo apt-get install python-pip
If virtualenv is not installed, use pip to install it using following command:
sudo pip install virtualenv
Give the following command (where venv is the name you would like to give your temporary environment):
sudo virtualenv venv
Now, install Flask in that environment by activating the virtual environment with the following command:
source venv/bin/activate
Give this command to install Flask inside:
sudo pip install Flask
Next, run the following command to test if the installation is successful and the app is running:
sudo python __init__.py
It should display “Running on http://localhost:5000/” or "Running on http://127.0.0.1:5000/". If you see this message, you have successfully configured the app.
To deactivate the environment, give the following command:
deactivate
Issue the following command in your terminal:
sudo nano /etc/apache2/sites-available/FlaskApp
NOTE: Newer versions of Ubuntu (13.10+) require a ".conf" extension for VirtualHost files -- run the following command instead:
sudo nano /etc/apache2/sites-available/FlaskApp.conf
Add the following lines of code to the file to configure the virtual host. Be sure to change the ServerName to your domain or cloud server's IP address:
<VirtualHost *:80> ServerName mywebsite.com ServerAdmin admin@mywebsite.com WSGIScriptAlias / /var/www/FlaskApp/flaskapp.wsgi <Directory /var/www/FlaskApp/FlaskApp/> Order allow,deny Allow from all </Directory> Alias /static /var/www/FlaskApp/FlaskApp/static <Directory /var/www/FlaskApp/FlaskApp/static/> Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Save and close the file.
Enable the virtual host with the following command:
sudo a2ensite FlaskApp
Apache uses the .wsgi file to serve the Flask app. Move to the /var/www/FlaskApp directory and create a file named flaskapp.wsgi with following commands:
cd /var/www/FlaskApp sudo nano flaskapp.wsgi
Add the following lines of code to the flaskapp.wsgi file:
#!/usr/bin/python import sys import logging logging.basicConfig(stream=sys.stderr) sys.path.insert(0,"/var/www/FlaskApp/") from FlaskApp import app as application application.secret_key = 'Add your secret key'
Now your directory structure should look like this:
|--------FlaskApp |----------------FlaskApp |-----------------------static |-----------------------templates |-----------------------venv |-----------------------__init__.py |----------------flaskapp.wsgi
Restart Apache with the following command to apply the changes:
sudo service apache2 restart
You may see a message similar to the following:
Could not reliably determine the VPS's fully qualified domain name, using 127.0.0.1 for ServerName
This message is just a warning, and you will be able to access your virtual host without any further issues. To view your application, open your browser and navigate to the domain name or IP address that you entered in your virtual host configuration.
You have successfully deployed a flask application.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
One can simply use tornado and will avoid apache and setting virtual hosts.
I have followed this exactly, but instead of putting mywebsite.com i put flaskapp.myip in and tried going to http://flaskapp.myip. It came up with a “flaskapp.myip is unavailable or may not exist.” error.
What should I do?
Okay, now I’ve got it to sort of work, but instead of it showing the “Hello I love Digital Ocean” message it just shows me a directory of my files… :/
@garethprice: Disable Apache’s default virtualhost:
<pre>sudo a2dissite default</pre>
Edit the virtualhost you created and set ServerName to e.g. <pre> ServerName flaskapp.dev</pre> and restart Apache.
<pre>sudo service apache2 restart</pre>
Edit <pre>/etc/hosts</pre> <strong>on your computer</strong> and add this line to the bottom:
<pre>1.2.3.4 flaskapp.dev</pre>
Where 1.2.3.4 is your droplet’s IP address. Save it and point your browser to http://flaskapp.dev - it should load your flask app properly.
Thanks, Kamal. I’ll give it a go.
But what if I want others to be able to access it?
@garethprice: I assumed you don’t have a domain name since you set it to something.ip at first. If you own a domain name:
Follow this article to set up DNS records: https://www.digitalocean.com/community/articles/how-to-set-up-a-host-name-with-digitalocean
Set ServerName to your domain name and restart Apache
Kamal,
I set up a new droplet and followed this tutorial: https://www.digitalocean.com/community/articles/how-to-launch-your-site-on-a-new-ubuntu-12-04-server-with-lamp-sftp-and-dns
I did what you suggested and all I get is my list of files still. I’ve copied exactly your FlaskApp demonstration. You can see them at: http://opendiscovery.co.uk/FlaskApp/…
Sorry for being noobish.
@garethprice: Try running the following commands:
<pre>sudo a2dissite default sudo service apache2 restart</pre>
Does that fix it?
Yes, thank you! Last question: is there a way of getting the normal apache to load html/php files in the root dir, and wsgi to handle Flask in a subdir (as achieve through WSGIScriptAlias)?
@garethprice: The recommended way of doing that is to have php/html in a separate directory and your flask app in another directory and <strong>not</strong> mixing both apps together.
Create a separate virtualhost on a separate subdomain/domain for the php/html app.