将settings.py配置文件加载到字典中

3
假设我有一个名为settings.py的文件,它的内容如下:
{
    "translate_tabs_to_spaces": True,
    "word_wrap": "true",
    "font_face": "Monaco",
    "font_size": 14.0,
    "highlight_line": True,
    "ignored_packages":
    [
        ""
    ],
    "what": '''
            This is python file, not json
            '''
}

如何把它放入一个名为settings的字典中,并在我的主应用程序文件app.py中调用?
谢谢。

2
为什么不使用JSON?Python有一个“json”模块,使解码JSON数据变得非常容易。它还可以避免加载未经验证的Python代码的副作用,这在某些答案的评论中已经提到了。 - user849425
@Michael 因为我想使用''' ... '''。 - Adam
你能否在问题中添加一个例子? - user849425
在 Python 中,如果我使用三引号字符串,我就不需要转义任何内容。但是,如果我想手动编写具有大量双引号和单引号的字符串文字的设置文件,则可能会在 json 中出现问题。如果我有任何错误,请纠正我。 - Adam
1
在这种情况下,也许您想将设置文件编写为 INI 文件,并使用 ConfigParser 加载它。在我看来,INI 文件更易于人类阅读。 - user849425
3个回答

3

为什么不将字典命名为 settings,然后从 settings.py 导入呢?

settings.py

settings = {} # fill with your data

使用方法如下

>>> from settings import settings
>>> print settings
{}

另一种解决方案是直接在设置模块级别添加变量并直接使用它们,为什么需要一个字典?例如:

settings.py

translate_tabs_to_spaces = True
# more settings

像这样使用它

>>> import settings
>>> settings.translate_tabs_to_spaces
True

-1,这很危险 - 它可能包含恶意代码。它还需要更改数据文件。 - Gareth Latty
2
@Lattyware 真的,OP没有告诉我们 settings.py 是如何创建的,可能它只是 Django 中使用的一个设置文件。 - Anurag Uniyal
2
@Lattyware 我并没有看到这种方法有什么危险性。如果字典没有被命名,那么它就不那么危险了?对我来说,这是正确的做法。谁会在文件中放置一个未命名的字典呢? - aschmid00
@aschmid00 问题在于你可以将任何代码放入此文件中,如果导入它,它将被运行。至于谁会将字典放入一个没有命名的文件中,那么很可能是编写设置文件的人。大多数设置文件不以 settings = { ... 开头。 - Gareth Latty
@Lattyware,所以您认为解决方案并不像您之前提到的那样危险,但您认为您的解决方案更简单? - Anurag Uniyal
显示剩余4条评论

1
你可以使用 ast.literal_eval() 来安全地完成这个任务。
import ast

data="""\
{
    "translate_tabs_to_spaces": True,
    "word_wrap": "true",
    "font_face": "Monaco",
    "font_size": 14.0,
    "highlight_line": True,
    "ignored_packages":
    [
        ""
    ],
    "what": '''
            This is python file, not json
            '''
}\
"""

print(ast.literal_eval(data))

给我们:
{'what': '\n            This is python file, not json\n            ', 'font_size': 14.0, 'translate_tabs_to_spaces': True, 'font_face': 'Monaco', 'word_wrap': 'true', 'highlight_line': True, 'ignored_packages': ['']}

编辑:

根据提问者的新评论,他想在配置中使用...,因此ast.literal_eval()不适用,因为它无法处理省略号。目前还不清楚他的意思是否是这个,但这仍然是对所提出问题的一个很好的回答。

事实证明,提问者所说的是三引号字符串,这个可以被正确处理。


1
-1 无需进行文字评估,只需导入模块并获取所有Python免费好处。 - Anurag Uniyal
2
很抱歉,按照这种偏执的逻辑,我们应该使用ast来处理所有它可以处理的导入,而不是直接导入。这对我来说毫无意义。如果有人可以访问settings.py,那么他们也可以访问源代码的其余部分。此时,他们可以随心所欲地进行任何操作;ast.literal_eval已经无法阻止他们了。 - senderle
1
@Lattyware 我同意 senderie 的观点,如果攻击者能够篡改您的设置文件,那么您的整个源代码库也会受到威胁。 - cobie
@cobie 这是不正确的 - 实际上,用户更新设置文件的可能性要比任何源代码更大。许多人遵循来自互联网的指南和修复程序,这些指南和修复程序涉及更改设置文件。 - Gareth Latty
@Lattyware,因此您认为用户实施的这些修复措施可能是恶意的吗? - cobie
显示剩余7条评论

1
在设置模块中给设置字典命名,然后将设置模块导入到您的模块中,并将其加载到变量中,例如:
import settings
your_settings = settings.settings_dict

-1,这很危险 - 它可能包含恶意代码。它还需要更改数据文件。 - Gareth Latty
如果您正在使用设置模块,那么它肯定是由您编写的,我猜测。 - cobie
1
@Lattyware 真的,OP没有告诉我们 settings.py 是如何创建的,可能它只是 Django 中使用的一个设置文件。 - Anurag Uniyal
我并不是说这种情况很可能发生,但为什么要引入这种风险呢?如果用户盲目地复制/粘贴设置文件,为什么要让他们有可能引入一些恶意内容呢? - Gareth Latty
@Lattyware,那么在您的意见中,Django 项目不应该使用 settings.py 吗? - Anurag Uniyal
显示剩余2条评论

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