Configuration logic
===================
Starting from 1.1 certain logic constructs are available.
The following statements are currently supported:
* ``for`` .. ``endfor``
* ``if-dir`` / ``if-not-dir``
* ``if-env`` / ``if-not-env``
* ``if-exists`` / ``if-not-exists``
* ``if-file`` / ``if-not-file``
* ``if-opt`` / ``if-not-opt``
* ``if-reload`` / ``if-not-reload`` -- undocumented
Each of these statements exports a context value you can access with the
special placeholder ``%(_)``. For example, the "for" statement sets ``%(_)`` to
the current iterated value.
.. warning:: Recursive logic is not supported and will cause uWSGI to promptly exit.
for
---
For iterates over space-separated strings. The following three code blocks are equivalent.
.. code-block:: ini
[uwsgi]
master = true
; iterate over a list of ports
for = 3031 3032 3033 3034 3035
socket = 127.0.0.1:%(_)
endfor =
module = helloworld
.. code-block:: xml
3031 3032 3033 3034 3035
127.0.0.1:%(_)
helloworld
.. code-block:: sh
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:
.. code-block:: ini
[uwsgi]
for = a b c
socket = /var/run/%(_).socket
http-socket = /var/run/%(_)-http.socket
endfor =
is expanded to:
.. code-block:: ini
[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
if-env
------
Check if an environment variable is defined, putting its value in the context
placeholder.
.. code-block:: ini
[uwsgi]
if-env = PATH
print = Your path is %(_)
check-static = /var/www
endif =
socket = :3031
if-exists
---------
Check for the existence of a file or directory. The context placeholder is set
to the filename found.
.. code-block:: ini
[uwsgi]
http = :9090
; redirect all requests if a file exists
if-exists = /tmp/maintenance.txt
route = .* redirect:/offline
endif =
.. note:: The above example uses :doc:`InternalRouting`.
if-file
-------
Check if the given path exists and is a regular file. The context placeholder
is set to the filename found.
.. code-block:: xml
python
:8080
settings.py
django.core.handlers.wsgi:WSGIHandler()
if-dir
------
Check if the given path exists and is a directory. The context placeholder is
set to the filename found.
.. code-block:: yaml
uwsgi:
socket: 4040
processes: 2
if-dir: config.ru
rack: %(_)
endif:
if-opt
------
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 ``if-opt``.
.. code-block:: yaml
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
``option-name=value`` to ``if-opt``.
.. code-block:: yaml
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-opt`` option 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 ``inherit`` options).
* ``if-opt`` is processed after expanding magic variables, but before
expanding placeholders and other variables. So if you use ``if-opt``
to 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 ``%(_)`` inside the ``if-opt``
block, 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 ``if-opt``.
* Only explicitly set values will be seen, not implicit defaults.
.. seealso:: :doc:`ParsingOrder`