【问题标题】:Django App Install Script - How to add app to INSTALLED_APPS setting?Django App Install Script - 如何将应用程序添加到 INSTALLED_APPS 设置?
【发布时间】:2011-09-06 16:36:41
【问题描述】:

我已经编写了一个 Django 应用,现在我想让它轻松部署在多个服务器上。

基本安装是:

  1. 将app文件夹复制到Django项目文件夹中
  2. 将其添加到INSTALLED_APPS 中的settings.py
  3. 运行./manage.py collectstatic

这个特定的应用程序不需要使用 DB,但如果需要,我会使用 south 并运行 ./manage.py migrate,但那是另一回事了。

我遇到问题的部分是#2。我不想每次都手动编辑这个文件。更新它的最简单/最可靠的方法是什么?

我在想我可以使用inspect 模块来查找变量,然后以某种方式附加它,但我没有运气。 inspect.getsourcelines 找不到变量。

【问题讨论】:

    标签: python django installation


    【解决方案1】:

    以下是我认为这是错误的原因:

    • 它是额外的代码复杂性,没有任何大的需求,每次在设置中添加一行并不是那么糟糕,尤其是在执行步骤 #1 和 #3 时。
    • 您的项目正在使用哪些应用程序将变得不明确。当其他开发人员处理您的项目时,他可能不知道您的应用已安装。
    • 您应该在代码版本控制系统上执行第 1 步和第 2 步,测试整个系统,然后提交更改,然后进行部署。

    如果您正在寻找这样的“优化”,我认为您的开发/部署过程中有问题(从我的角度来看)。我认为使用INSTALLED_APPS 更容易更好。

    如果您正在构建供公众使用的东西,并且希望尽可能轻松地添加模块,那么它会很好。在这种情况下,我建议将项目及其应用程序打包为 python 鸡蛋并使用入口点。然后你可以像这样将应用部署到项目中:

    pip install my-app-name
    

    甚至没有第 1 步和第 3 步!步骤#1 将由pip 完成,步骤#2 和#3 将由项目中定义的设置挂钩完成。

    Paste script 是入口点利用的一个很好的例子:

    # Install paste script:
    pip install pastescript
    
    # install django templates for pastescript:
    pip install fez.djangoskel
    
    # now paste script knows about fez.djangoskel because of entry-points
    
    # start a new django project from fez's templates:
    paste create -t django_buildout
    

    这是 fez.djangoskel 包中setup.py 的一部分:

    ...
    entry_points="""
    [paste.paster_create_template]
    django_buildout=fez.djangoskel.pastertemplates:DjangoBuildoutTemplate
    django_app=fez.djangoskel.pastertemplates:DjangoAppTemplate
    ...
    

    zc.buildout 是另一个很棒的工具,它可以让您的部署更加轻松。 Python 鸡蛋非常适合构建。

    【讨论】:

    • (1) 实际上不仅仅是 1 行。在不同的地方有几行。我可以使用相同的方法来完成所有这些。 1 和 3 不会手动完成,它们也会自动完成。 (2) 为什么不明确?该脚本会将其显式添加到 INSTALLED_APPS。任何开发人员都可以通过查看 settings.py 来查看更新。 (3) 不能。这是一个附加组件; settings.py 可能会以我不想触及的其他方式更改,因此版本控制将不起作用。出于同样的原因,PIP 将不起作用。我没有可以插入挂钩的静态 settings.py 文件。--
    • -- 因为 settings.py 是由第三方维护的。
    • @Mark,您可以拥有自己的设置文件,该文件被跟踪并使用from client_settings import * 加载第三方设置。然后您可以动态修改 INSTALLED_APPS 属性。
    • 我可以....而且我想我也可以很容易地在文件底部注入那行代码。不错的主意,但不如拥有 1 个文件那么干净。你能想象如果所有插件都这样做吗?
    • 您将只有 2 个设置文件:default-settings - 在 CVS 中使用非常重要的设置进行跟踪; local-settings - 满足您客户的特定需求。这种方法比将所有设置保存在非跟踪文件中更干净。在您的default-settings 文件中,您可以在系统路径中实现对可用模块的搜索,如果您发现某些内容,您可以将应用程序附加到INSTALLED_APPS。我还认为从脚本中向settings.py 注入额外的python 代码是最糟糕的事情之一,这种方法可能会出错。
    【解决方案2】:

    您可以使用 bash 修改您的 settings.py。

    #set $SETTINGS_FILE variable to full path of the your django project settings.py file
    SETTINGS_FILE="/path/to/your/django/project/settings.py"
    # checks that app $1 is in the django project settings file
    is_app_in_django_settings() {
        # checking that django project settings file exists
        if [ ! -f $SETTINGS_FILE ]; then
            echo "Error: The django project settings file '$SETTINGS_FILE' does not exist"
            exit 1
        fi
        cat $SETTINGS_FILE | grep -Pzo "INSTALLED_APPS\s?=\s?\[[\s\w\.,']*$1[\s\w\.,']*\]\n?" > /dev/null 2>&1
        # now $?=0 if app is in settings file
        # $? not 0 otherwise
    }
    
    # adds app $1 to the django project settings
    add_app2django_settings() {
        is_app_in_django_settings $1
        if [ $? -ne 0 ]; then
            echo "Info. The app '$1' is not in the django project settings file '$SETTINGS_FILE'. Adding."
            sed -i -e '1h;2,$H;$!d;g' -re "s/(INSTALLED_APPS\s?=\s?\[[\n '._a-zA-Z,]*)/\1    '$1',\n/g" $SETTINGS_FILE
            # checking that app $1 successfully added to django project settings file
            is_app_in_django_settings $1
            if [ $? -ne 0 ]; then
                echo "Error. Could not add the app '$1' to the django project settings file '$SETTINGS_FILE'. Add it manually, then run this script again."
                exit 1
            else
                echo "Info. The app '$1' was successfully added to the django settings file '$SETTINGS_FILE'."
            fi
        else
            echo "Info. The app '$1' is already in the django project settings file '$SETTINGS_FILE'"
        fi
    }
    

    用途:

    add_app2django_settings "my_app"
    

    【讨论】:

      猜你喜欢
      • 2020-01-16
      • 2013-12-27
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      相关资源
      最近更新 更多