如何确定Flask应用程序是否在本地主机上运行?

3

我希望我的Flask应用程序在本地运行时和在线托管时有不同的行为。 我该如何从Flask应用程序中检测它是在本地主机上还是部署时?


2
所有的网站都是在本地主机上运行的。毕竟它们就是在一个主机上。你是不是指如果通过http://localhost...访问网站时,希望有不同的行为? - undefined
你应该有一个开发配置文件和一个部署配置文件,不是吗? - undefined
3个回答

4
您需要查看文档中的配置处理部分,特别是开发/生产部分。这里简要概括一下,您需要做的是:
  • 加载一个基础配置,其中包含对某些需要有值的内容设置合理默认值,并将其保存在源代码控制中。任何需要值的内容都应该设置为适用于生产而不是开发的值。
  • 从通过环境变量发现的路径加载附加配置,提供环境特定的设置(例如数据库URL)。

以下是示例代码:

from __future__ import absolute_imports
from flask import Flask
import .config  # This is our default configuration

app = Flask(__name__)

# First, set the default configuration
app.config.from_object(config)

# Then, load the environment-specific information
app.config.from_envvar("MYAPP_CONFIG_PATH")

# Setup routes and then ...

if __name__ == "__main__":
    app.run()

参见:Flask.config 的文档


2
这里有一种方法可以实现。关键在于将当前根URL flask.request.url_root 与你想匹配的已知URL值进行比较。
节选自github repo https://github.com/nueverest/vue_flask
from flask import Flask, request

def is_production():
    """ Determines if app is running on the production server or not.
    Get Current URI.
    Extract root location.
    Compare root location against developer server value 127.0.0.1:5000.
    :return: (bool) True if code is running on the production server, and False otherwise.
    """
    root_url = request.url_root
    developer_url = 'http://127.0.0.1:5000/'
    return root_url != developer_url

2
我尝试了这个,但是使用“request.url_root”时出现以下错误:RuntimeError:在请求上下文之外工作。这通常意味着您尝试使用需要活动HTTP请求的功能。请参阅有关如何避免此问题的测试文档。有任何想法为什么会出现这种情况吗?通过Google搜索,人们经常谈论使用request.url_root,但我没有看到其他人遇到这个错误。 - undefined

0
丑陋,但它确实有效...
import subprocess, shlex

def get_running_flask_processes(port):
    processes = []
    cmd = f"lsof -ti:{port}"
    result = subprocess.run(shlex.split(cmd), capture_output=True, text=True)
    if result.stdout:
        if "\n" in result.stdout:
            processes += result.stdout.split("\n")
            processes = [int(x) for x in processes if x != '']
        else:
            processes += [int(result.stdout)]
    return processes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接