2016-04-15 42 views
2

我正在使用Flask扩展,从中我想在文件系统的项目根路径中创建一个目录。获取Flask应用程序的根路径

假设我们有此目录结构

/project 
    /app 
    /tests 
    /my_folder 
    manage.py 

my_folder应该动态地扩展,这是一种测试工具和下在/测试目录测试包的应用来创建。但是,我正在努力确定项目在我的扩展中的根路径。作为测试从IDE,而不是manage.py内运行,一旦

def root_path(self): 
    # Infer the root path from the run file in the project root (e.g. manage.py) 
    fn = getattr(sys.modules['__main__'], '__file__') 
    root_path = os.path.abspath(os.path.dirname(fn)) 
    return root_path 

这显然打破了:

现在,我想从运行文件猜的路径。我可以简单地推断项目的根相对于应用程序或测试目录,但我不想对这些目录的名称或结构做任何假设(因为多个应用程序可能作为一个包装中的子包托管)。

我想知道是否有这种类型的问题或Flask对象提供的未记录方法(如get_root_path)的最佳做法。

回答

9

app.root_path包含应用程序的根路径。这是基于名称determined传递给Flask。通常,您应该使用instance pathapp.instance_path)而不是根路径,因为实例路径不在包代码内。

filename = os.path.join(app.instance_path, 'my_folder', 'my_file.txt') 
+1

正是我在找的,谢谢!我的单线解决方案:'root_path = os.path.sep.join(self.app.instance_path.split(os.path.sep)[: - 1])' – thyrel

+1

@thyrel完全错过了一点:你应该使用'app.instance_path'而不是任何种类的根路径。如果您确实需要根路径,请使用'app.root_path'。如果你想在实例路径上面的路径,你可以使用'os.path.join(app.instance_path,'..')',尽管你不应该这样做。 – davidism

相关问题