获取django app的绝对路径

xu3bshqb  于 2023-05-30  发布在  Go
关注(0)|答案(7)|浏览(202)

我正在写一个单元测试,需要访问一个图像文件,我把它放在django app目录下的“fixtures”目录中。我想在我的测试中使用相对路径打开这个图像文件,这需要我获得django应用程序的绝对路径。有没有办法获取django应用的绝对路径?

aiazj4mn

aiazj4mn1#

Python模块(包括Django应用程序)有一个__file__属性,它告诉你它们的__init__.py文件在文件系统中的位置,所以

import appname
pth = os.path.dirname(appname.__file__)

应该做你想做的事
在通常情况下,os.path.absname(appname.__path__[0]),但如果应用程序想要以一种奇怪的方式导入文件,则可以更改此设置。
(不过,我总是在我的settings.py中使用PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))--这使得需要绝对路径的各种设置变得容易。)

j91ykkif

j91ykkif2#

因此,接受的答案通常工作正常。然而,对于

  • 具有多个路径的命名空间包,或
  • 在配置中显式配置其路径的应用程序,

它们的预期路径可能与模块的__file__属性不一致。
Django(1.7+)提供了AppConfig.path属性-我认为即使在简单的情况下也更清晰,并且也涵盖了这些边缘情况。
The application docs告诉你如何获取AppConfig对象。获取AppConfig并打印路径:

from django.apps import apps
print(apps.get_app_config('app_label').path)

编辑:修改了如何使用get_app_config删除点的示例,这似乎令人困惑。这是参考文档。

gg0vcinb

gg0vcinb3#

通常,这是我在www.example.com文件中添加的内容settings.py,这样我就可以引用项目根。

import os.path

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))

此方法将获取任何python文件的目录。

enyaitl3

enyaitl34#

在较新版本的Django(我不知道它是什么时候开始的,我想它已经存在了很多年了),默认的settingy.py包含一个条目

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

您可以通过导入设置文件来使用它,如下所示

import os    
from my_project_name.settings import BASE_DIR

os.path.join(BASE_DIR, ...)
x0fgdtte

x0fgdtte5#

Python3.4及更高版本附带标准库pathlib

from pathlib import Path
import appmodule

pth = Path(appmodule.__file__).parent / 'fixtures'
if pth.exists():
     "Your code here"

parent将为您提供应用程序目录的路径,/将追加fixture作为路径。

piok6c0g

piok6c0g6#

请记住,appname.__path__是一个列表:

import appname
APP_ROOT = os.path.abspath(appname.__path__[0])
file_path = os.path.join(APP_ROOT, "some_file.txt")
dbf7pr2w

dbf7pr2w7#

Django自动生成的设置文件有以下内容,你也可以使用
BASE_DIR = Path(file).resolve().parent.parent

相关问题