我有一个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/