python应用程序的uwsgi.iniconfiguration

所以我正在尝试uWSGI并喜欢它。

我有一个关于使用.ini文件的问题。

是否有可能dynamic地计算其.iniconfiguration参数的值?

例如,对于我的“uwsgi.ini”文件中的“chdir”值,我有

[uwsgi] socket=127.0.0.1:3034 chdir=/Users/calvin/work/myproject virtualenv=/Users/calvin/.virtualenvs/myproject module=django.core.handlers.wsgi:WSGIHandler() env= DJANGO_SETTINGS_MODULE=myproject.settings master=True pidfile=/tmp/myproject-master.pid vacuum=True max-requests=5000 daemonize=/var/log/uwsgi/myproject.log 

为我的“本地机器”,我的“开发/登台”服务器和我的“生产服务器”编写3个单独的.ini文件是相当麻烦的。 更不用说同事的本地机器的chdir价值将会完全不同。

我尝试使用import osos.join.pathdynamic计算chdir值,但它不起作用,这是可以预料的,因为uwsgi没有Python解释器?

我在通过uwsgi文档挖掘一下之后,自己find了答案。

参考http://projects.unbit.it/uwsgi/wiki/ConfigLogic ,我们可以指定configuration逻辑,并通过在python virtualenv中使用环境variables来dynamic计算path。

所以假设我目前在我的项目virtualenv中,我的.iniconfiguration会自动计算我的chdirvirtualenv .iniconfiguration选项的path,如下所示:

 [uwsgi] if-env = PROJECT_HOME print = Your path is %(_)/myproject chdir = %(_)/myproject endif = if-env = VIRTUAL_ENV print = Your virtualenv is %(_) virtualenv = %(_) endif = socket=127.0.0.1:3034 module=django.core.handlers.wsgi:WSGIHandler() env= DJANGO_SETTINGS_MODULE=bbox.settings master=True pidfile=/tmp/project-master.pid vacuum=True max-requests=5000 daemonize=/var/log/uwsgi/yourproject.log 

当然,print语句是可选的,但是这给了uwsgi二进制文件chdirvirtualenv所期望的值。

像这样的东西:

 calvin$ uwsgi --ini myproject/uwsgi.ini [uWSGI] getting INI configuration from myproject/uwsgi.ini Your path is /Users/calvin/work/myproject Your virtualenv is /Users/calvin/.virtualenvs/myproject *** Starting uWSGI 1.2.4 (64bit) on [Thu Jul 26 17:00:04 2012] *** compiled with version: 4.2.1 Compatible Apple Clang 3.1 (tags/Apple/clang-318.0.61) on 25 July 2012 20:06:56 detected number of CPU cores: 8 

当然你的最终.ini文件中不需要打印语句。 我只是把它们放在那里,以便打印出确认我的path是在.ini文件中dynamic计算的必要信息。

我不确定使用不同的configuration文件来运行开发和生产版本是一个很好的做法 – 这通常是一种“dev”版本中出现的“奇怪”问题(由于不同的文件权限或其他原因)。 更好的做法是像make install一样make install而且总是使用类似生产的configuration。 或者,您可以将您的源代码链接到您的homedir中的项目目录,以便在原地进行编辑。 但是,您的configuration又是独一无二的。

根据卡尔文给出的答案,使用'@'魔法可以在dynamicconfiguration方面有更多的灵活性。

@(exec://...)可用于评估bash命令。 在我的情况下,它允许我定义: realpath = @(exec://bash -c 'dirname `readlink -f %p`')我正在寻找,因为我已经从另一个目录realpath = @(exec://bash -c 'dirname `readlink -f %p`')链接此configuration。