Starting from 1.1 certain logic constructs are available.
The following statements are currently supported:
Each of these statements exports a context value you can access with the
%(_). For example, the “for” statement sets
the current iterated value.
Recursive logic is not supported and will cause uWSGI to promptly exit.
For iterates over space-separated strings. The following three code blocks are equivalent.
[uwsgi] master = true ; iterate over a list of ports for = 3031 3032 3033 3034 3035 socket = 127.0.0.1:%(_) endfor = module = helloworld
<uwsgi> <master/> <for>3031 3032 3033 3034 3035</for> <socket>127.0.0.1:%(_)</socket> <endfor/> <module>helloworld</module> </uwsgi>
uwsgi --for="3031 3032 3033 3034 3035" --socket="127.0.0.1:%(_)" --endfor --module helloworld
Note that the for-loop is applied to each line inside the block separately, not to the block as a whole. For example, this:
[uwsgi] for = a b c socket = /var/run/%(_).socket http-socket = /var/run/%(_)-http.socket endfor =
is expanded to:
[uwsgi] socket = /var/run/a.socket socket = /var/run/b.socket socket = /var/run/c.socket http-socket = /var/run/a-http.socket http-socket = /var/run/b-http.socket http-socket = /var/run/c-http.socket
Check if an environment variable is defined, putting its value in the context placeholder.
[uwsgi] if-env = PATH print = Your path is %(_) check-static = /var/www endif = socket = :3031
Check for the existence of a file or directory. The context placeholder is set to the filename found.
[uwsgi] http = :9090 ; redirect all requests if a file exists if-exists = /tmp/maintenance.txt route = .* redirect:/offline endif =
The above example uses uWSGI internal routing.
Check if the given path exists and is a regular file. The context placeholder is set to the filename found.
<uwsgi> <plugins>python</plugins> <http-socket>:8080</http-socket> <if-file>settings.py</if-file> <module>django.core.handlers.wsgi:WSGIHandler()</module> <endif/> </uwsgi>
Check if the given path exists and is a directory. The context placeholder is set to the filename found.
uwsgi: socket: 4040 processes: 2 if-dir: config.ru rack: %(_) endif:
Check if the given option is set, or has a given value. The context placeholder is set to the value of the option reference.
To check if an option was set, pass just the option name to
uwsgi: cheaper: 3 if-opt: cheaper print: Running in cheaper mode, with initially %(_) processes endif:
To check if an option was set to a specific value, pass
uwsgi: # Set busyness parameters if it was chosen if-opt: cheaper-algo=busyness cheaper-busyness-max: 25 cheaper-busyness-min: 10 endif:
Due to the way uWSGI parses its configs, you can only refer to options that uWSGI has previously seen. In particular, this means:
Only options that are set above the
if-optoption are taken into account. This includes any options set by previous
include(or type specific includes like
ini) options, but does not include options set by previous
if-optis processed after expanding magic variables, but before expanding placeholders and other variables. So if you use
if-optto compare the value of an option, check against the value as stated in the config file, with only the magic variables filled in.
If you use the context placeholder
if-optblock, you should be ok: any placeholders will later be expanded.
If an option is specified multiple times, only the value of the first one will be seen by
Only explicitly set values will be seen, not implicit defaults.