Django应用安装脚本 - 如何将应用添加到INSTALLED_APPS设置中?
我写了一个Django应用,现在我想让它在多个服务器上部署变得简单。
基本的安装步骤是:
- 把应用文件夹复制到Django项目文件夹里
- 在
settings.py
文件的INSTALLED_APPS
里添加这个应用 - 运行
./manage.py collectstatic
命令
这个应用不需要用到数据库,但如果需要的话,我会用south工具并运行./manage.py migrate
,不过那是另一个话题。
我现在遇到的问题是第二步。我不想每次都手动编辑这个文件。有没有简单又可靠的方法来更新它呢?
我在想可以用inspect
模块来找到这个变量,然后以某种方式把它添加进去,但我没有成功。inspect.getsourcelines
找不到变量。
2 个回答
2
以下是我认为这样做不对的原因:
- 这样会增加代码的复杂性,但其实并没有太大的必要。每次在设置中添加一行代码并不是很麻烦,尤其是如果你已经在做第1步和第3步的时候。
- 这样会让你的项目使用了哪些应用变得不明确。当其他开发者来处理你的项目时,他们可能不知道你的应用已经安装了。
- 你应该在代码版本管理系统中完成第1步和第2步,测试整个系统,然后再提交更改,最后再进行部署。
如果你在寻找这样的“优化”,那么我觉得你的开发/部署流程可能有些问题。我认为使用 INSTALLED_APPS
会更简单、更好。
如果你是在为公众使用构建一些东西,并且希望尽可能简单地添加模块,那这样做是不错的。在这种情况下,我建议将项目及其应用打包成 Python 蛋(python eggs),并利用入口点。这样你就可以像下面这样将应用部署到项目中:
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 蛋与 buildout 的配合非常好。
3
你可以通过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"