我有一个Flask应用程序,它有一些密码组件。具体来说,磁盘上有一个密钥是加密的,并且必须在内存中未加密,以便在Flask应用程序进程中使用。为了解除密钥的加密,当应用程序运行时,系统会提示用户使用getpass输入一个密码短语。
这对于app.run()和一个前台Flask WSGI服务器非常有用。我们遇到的问题是,当使用uWSGI部署时,uWSGI控制器不允许stdin。
理想情况下,我们希望发生的情况与使用SSL重新启动或启动Apache或Nginx时类似——在服务分叉之前,它会提示在stdin上输入密码。
任何帮助都将不胜感激!
更新
尽管我们仍然希望使用uWSGI,但我们已经转移到gunicorn,因为gunicorn的pre fork选项。这个解决方案仍然不理想,特别是因为我们没有能力添加像UPSTART这样的监控服务。实际上,我们有一个之前运行的脚本,它使用read将密码设置为一个环境变量并将该环境变量传递给gunicorn应用程序。

#!/bin/bash

NAME="baz"                                  # Name of the application
APPDIR=/var/apps/baz                        # Application project directory
SOCKFILE=/var/apps/baz/gunicorn.sock        # Using a socket
BIND="127.0.0.1:8000"                       # Using a port
USER="www-data"                             # User to run as
GROUP="www-data"                            # Group to run as
WORKERS=1                                   # How many worker processes

echo "Starting $NAME"

# Collect the passphrase
read -s -p "Enter $NAME passphrase: " PASSPHRASE
echo ""

# Activate the virtual environment
source /var/venvs/baz/bin/activate
export BAZ_SETTINGS="baz.conf.Config"
export BAZ_PASSPHRASE=$PASSPRHASE

# Start Gunicorn
exec gunicorn $NAME:app \
    --user $USER --group $GROUP \
    --bind $BIND \
    --workers $WORKERS \
    --chdir $APPDIR \
    --env BAZ_PASSPHRASE=$PASSPHRASE \
    --daemon

这或多或少是教程Setting up Django with Nginx, Gunicorn, virtualenv, supervisor and PostgreSQL中使用的脚本,修改后用于读取密码短语和与Flask一起使用。
我们已经检查以确保BAZ_PASSPHRASE环境变量不存在于任何环境中,但是这仍然感觉有点吱吱响,所以我们仍然很感激任何评论,特别是关于UWSGI。

最佳答案

只需添加--honour-stdin它将禁用将文件描述符0重新映射到/dev/null
如果调用--daemonize将失去控制终端,因此在使用--daemonize2读取输入后,必须推迟后台监控

关于python - 在使用uWSGI进行部署时,如何通过getpass给Flask应用提供输入?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18768241/

10-12 16:56
查看更多