Django App安装脚本 - 如何将应用程序添加到INSTALLED_APPS设置?

时间:2011-09-06 16:36:41

标签: python django install

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

基本安装是:

  1. 将app文件夹复制到Django项目文件夹
  2. 将其添加到INSTALLED_APPS
  3. 中的settings.py
  4. 运行./manage.py collectstatic
  5. 这个特定的应用程序不需要使用数据库,但如果确实如此,我会使用南方并运行./manage.py migrate,但这是另一个故事。

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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 egg对于buildout非常有用。

答案 1 :(得分:1)

您可以使用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"