草庐IT

python - 我们可以将 apps.py 用于应用程序级配置,而不是将 settings.py 用于项目级配置吗?

coder 2023-08-13 原文

This question has been asked earlier: What is the purpose of apps.py in Django 1.9?

Application configuration objects store metadata for an application. Some attributes can be configured in AppConfig subclasses. Others are set by Django and read-only.

但是,应用程序的元数据意味着什么?是否仅限于那些AppConfig metadata:name, verbose_name, path, label, module, models_module

或者扩展到预定义的元数据之外是否有意义,特别是对于特定于应用程序的元数据,例如在 blog 应用程序中,我们有一个日期格式配置,通常定义为如下:

# File: settings.py
BLOG = {
    'DATE_FORMAT': 'ddMMYYY',
}

使用方法如下:

# File: blog/<...>.py
from django.conf import settings
date_format = settings.BLOG['DATE_FORMAT']

相反,我们可以将此配置移动到 blog/apps.py 中作为 BlogConfig?

class BlogConfig(AppConfig):
    name = 'blog'
    verbose_name = 'Awesome Blog'
    date_format = 'ddMMYYYY'

因此在应用程序的整个代码中,date_format 被以下人员使用:

# File: blog/<...>.py
from django.apps import apps
date_format = apps.get_app_config('blog').date_format

在我看来,settings.py项目 设置,而不是应用程序设置。因此,将所有应用程序设置放在 apps.py 中然后放在 settings.py 中听起来更合理。那么,对于我来说,将应用程序配置放在 apps.py 而不是 settings.py 中是否是一个有效的假设/论据/惯例?

最佳答案

每个 django 安装的项目都是唯一的,而应用程序应该是可重用的。

如果您将自定义应用程序设置放在项目的 settings.py 中,它们应该是可修改的,尤其是当您(或其他人)将此应用程序重新用于另一个项目时。

现在,如果您将这些自定义设置放在应用的 apps.py 中,这意味着它们将无法在每个项目的基础上进行修改。在这种情况下,没有理由将它们放在 apps.py 而不是 constants 子模块中。除非您想提供一组有限的可能配置:

class BlogConfig(AppConfig):
    name = 'blog'
    verbose_name = "Blog"
    date_format = 'ddMMYYYY'


class CustomizableDateFormatBlogConfig(BlogConfig):
    date_format = getattr(settings, 'BLOG_DATE_FORMAT', BlogConfig.date_format)


class I18nBlogConfig(BlogConfig)
    verbose_name = _("Blog")

default_app_config 将是 BlogConfig 但使用该应用程序的项目将能够选择 CustomizableDateFormatBlogConfigI18nBlogConfig

然而,这使得可定制性非常差的应用程序。在上面的示例中,如果您想让应用程序用户同时使用 CustomizableDateFormatBlogConfigI18nBlogConfig,您需要执行以下操作:

class BlogConfig(AppConfig):
    name = 'blog'
    verbose_name = "Blog"
    date_format = 'ddMMYYYY'


class CustomizableDateFormatMixin:
    date_format = getattr(settings, 'BLOG_DATE_FORMAT', BlogConfig.date_format)


class I18nMixin:
    verbose_name = _("Blog")


class CustomizableDateFormatBlogConfig(CustomizableDateFormatMixin, BlogConfig):
    pass


class I18nBlogConfig(I18nMixin, BlogConfig):
    pass


class I18nCustomizableDateFormatBlogConfig(I18nMixin, CustomizableDateFormatMixin, BlogConfig):
    pass

因此,除了需要提供一组几个不同的应用配置的特定情况外,您最好将自定义应用设置放在项目的 settings.py 中。

关于python - 我们可以将 apps.py 用于应用程序级配置,而不是将 settings.py 用于项目级配置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38075176/

有关python - 我们可以将 apps.py 用于应用程序级配置,而不是将 settings.py 用于项目级配置吗?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  4. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  5. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  6. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  7. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  8. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  9. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  10. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

随机推荐