How can I have my flask-app run on my sites subdomain?

Sanjay picture Sanjay · Jul 24, 2017 · Viewed 8.6k times · Source

For example, I want to run flask-app on http://api.domain.com . However, I have no idea how to do this and the flask documentation serves no help. I am using a shared namecheap web server via SSH to run python. I have ports 8080, 8181 and 8282 open.

Server-sided code:

from flask import Flask
from flask import Blueprint

app = Flask(__name__)
app.config['SERVER_NAME'] = 'domain.com'

@app.route('/status')
def status():
   return 'Status : Online'

bp = Blueprint('subdomain', __name__, subdomain="api")

app.register_blueprint(bp)

if __name__ == '__main__':
   app.run(host=app.config["SERVER_NAME"],port=8181,debug=True)

When I visit http://www.api.domain.com/status , it returns a 404 error. Nothing displays on the SSH console.

Any help if very much appreciated.

Answer

MrE picture MrE · Jul 24, 2017

First things first:

http (i.e. a web server without a SSL certificate) is insecure. You should set up a certificate and always use port 443 to the outside.

Then, on namecheap, you need to define a CNAME entry to point to the subdomain.

In Namecheap, click domain -> Manage, then Advanced DNS

Create a new record, select CNAME as the Type, and enter the subdomain name (just the top level) as the HOST, then the IP where you server is as the value (TTL (time to live) is the time it takes to change when you want to change it next time, 1, 10min is useful to debug stuff, but DNS may not honor that anyways...)

Wait a few minutes, and you should be able to reach your server at the subdomain name.

Now, if you use the same IP as a webserver for example, but a different port, that is basically not gonna do what you want. The DNS will forward subdomain traffic to your (same) server IP, so if your webserver is on port 443, you will also reach it with https://api.domain.com. If your API uses port 8080 or 8081, you will need to always specify the port to actually reach the API server at the subdomain (i.e api.domain.com:8080 ).

The DNS merely forwards the subdomain name to the IP you tell it to.