[TangerineSDR] Production server for flask

Engelke, Bill bill.engelke at ua.edu
Mon Dec 16 12:25:28 EST 2019


Rob - thanks, and no worries. I got it working with the help of something on stacktrace. I needed to use a little bit different way of starting waitress than what the tutorial shows.

On another topic - did you have any comments on the DE-LH communication idea I sent you on 12/4?

-73- Bill

-----Original Message-----
From: Rob Wiesler <halcyone1024 at gmail.com> On Behalf Of Rob Wiesler
Sent: Saturday, December 14, 2019 6:11 PM
To: Engelke, Bill <bill.engelke at ua.edu>
Cc: tangerinesdr at lists.tapr.org
Subject: Re: Production server for flask

On Sat, Dec 14, 2019 at 22:58:17 +0000, Engelke, Bill wrote:
> I have been using flask to show the web pages & control everything for 
> TangerineSDR. It works great when using it from a browser running 
> directly on the Odroid.
>
> However, there is a use case where the user might like to show these 
> pages & control the system from his/her desktop.  For flask to work 
> with any IP other than 127.0.0.1, it requires a production server, 
> which in turn seems to require running in a virtual environment...
> some considerable complexity.  Typical example:
> https://www.digitalocean.com/community/tutorials/how-to-serve-flask-ap
> plications-with-uswgi-and-nginx-on-ubuntu-18-04
>
> ...here we see the need to install a variety of additional things, 
> where we clearly need to minimize the number of packages & 
> configurations.
>
> Do you (or anyone else on this email distribution) have any 
> recommended course of action here?

The simple answer is to use Waitress as the web server, like the tutorial I thought you were following recommends [0] (so I'm a little confused by your question).  Just install the Debian/Ubuntu "python3-waitress" package instead where it tells you to use pip, and use your own package name instead of "flaskr".

[0] https://flask.palletsprojects.com/en/1.1.x/tutorial/deploy/#run-with-a-production-server

I went through a small subset of this tutorial very quickly to make sure my instructions were correct.  If you have any problems, please share your code with me (via a git repo hosted somewhere).  Here's my simple
layout:

	.
	├── README
	└── tangerinesdr
	    ├── __init__.py
	    └── webapp
	        └── __init__.py

tangerinesdr/__init__.py is empty.
tangerinesdr/webapp/__init__.py is the simple Hello World file from very early in the tutorial:

	from flask import Flask
	
	app = Flask(__name__)
	
	@app.route('/')
	def hello_world():
		return "Hello, world!"

From the directory in which the tree above is rooted, I can serve this with the following command:

	sudo waitress-serve --port=80 --url-scheme=http tangerinesdr.webapp:app

Later steps in the tutorial tell you to create a `create_app' function instead of leaving a bare Flask app instance at the global level (which is not reentrant).  Here's tangerinesdr/webapp/__init__.py with that
change:

	from flask import Flask
	from os import makedirs

	def create_app(test_config=None):
		# create and configure the app
		app = Flask(__name__, instance_relative_config=True)
		app.config.from_mapping(
			SECRET_KEY='dev',
			DATABASE='/'.join((app.instance_path, 'tangerinesdr.webapp.sqlite'))
		)

		if test_config is None:
			# load the instance config, if it exists, when not testing
			app.config.from_pyfile('config.py', silent=True)
		else:
			# load the test config if passed in
			app.config.from_mapping(test_config)

		# ensure the instance folder exists
		try:
			makedirs(app.instance_path)
		except OSError:
			pass

		# a simple page that says hello
		@app.route('/')
		def hello():
			return "Hello, World!"

		return app

In this case, create_app is now a function that creates a Flask app instance, so you have to tell Waitress to call it instead of treating it as an app directly:

	sudo waitress-serve --port=80 --url-scheme=http --call tangerinesdr.webapp:create_app

Of course, you'll want to do the other things the tutorial says to do before production.  In particular, the SECRET_KEY needs to be set correctly, which I have not done.


More information about the TangerineSDR mailing list