【问题标题】:Why are environment variables empty in Flask apps?为什么 Flask 应用程序中的环境变量为空?
【发布时间】:2015-04-27 00:48:40
【问题描述】:

我有一个烧瓶应用程序 (my_app),它调用不同文件 (my_function) 中的函数:

my_app.py:

from my_functions import my_function
@app.route('/')
def index():
    my_function()
    return render_template('index.html')

my_functions.py:

def my_function():
    try:
        import my_lib
    except:
        print("my_lib not found in system!")
    # do stuff...

if __name__ == "__main__":
    my_function()

当我直接执行 my_functions.py(即 python my_functions.py)时,“my_lib”被正确导入;但是,当我执行烧瓶应用程序(即 python my_app.py)时,我收到“my_lib”的导入错误。

当我在每个文件的开头打印 LD_LIBRARY_PATH 变量时:

print(os.environ['LD_LIBRARY_PATH'])

我在调用my_functions.py的时候得到了正确的值,但是在调用my_app.py的时候没有得到任何值(空)。尝试在my_app.py开头设置这个值没有效果:

os.environ['LD_LIBRARY_PATH'] = '/usr/local/lib'

问题:

(1) 为什么在 Flask 应用中调用时“LD_LIBRARY_PATH”为空?

(2) 如何设置?

任何帮助表示赞赏。

【问题讨论】:

  • flask 是作为 apache 指令的一部分执行的吗? Apache 限制对环境变量的访问(出于非常好的理由,出于安全目的)。你想要的任何东西都需要通过 apache 指令或直接在正在执行的 wsgi 脚本中传递。至少对于 django 来说是这样的。
  • 现在我只是直接执行烧瓶应用程序。我最终将通过 nginx/gunicorn 执行它,但现在我想让它独立运行。我可能需要在一些烧瓶 wsgi 配置文件中设置这些变量吗?
  • 好吧,如果它被直接执行,你执行它的命令是什么?环境变量不会也不应该被传递到 Web 应用程序中,这很危险并且很容易造成安全隐患。如果您直接执行它,它可能会调用特殊的开发模式,这意味着您需要在 python 路径上设置您的 lib 或将要导入的东西。
  • 我正在从 shell 执行它:python my_app.py。这是寻找如何在 Flask 中导入变量的好建议。我会调查的。谢谢

标签: python flask environment-variables


【解决方案1】:

LD_LIBRARY_PATH 在执行烧瓶应用程序时被清除,可能是出于安全原因,正如 Mike 所建议的那样。

为了解决这个问题,我使用 subprocess 直接调用可执行文件:

import subprocess
call_str = "executable_name -arg1 arg1_value -arg2 arg2_value"
subprocess.call(call_str, shell=True, stderr=subprocess.STDOUT)

理想情况下,程序应该能够使用 python 绑定,但现在调用可执行文件是可行的。

【讨论】:

  • 想知道这是否有效。另外,如果我的 ld_library_path = '/usr/local/lib' , call_str 的值应该是多少?
猜你喜欢
  • 2019-11-25
  • 2013-08-12
  • 1970-01-01
  • 2017-03-31
  • 2020-02-13
  • 2016-10-08
  • 2014-08-02
  • 2019-03-02
  • 2016-11-17
相关资源
最近更新 更多