【簡介】
django-admin.py是Django的一個用於管理工作的命令列工具。本文將描述它的大概用法。
另外,在每一個Django project中都會有一個manage.py。manage.py是對django-admin.py的簡單封裝,它額外協助我們做了兩件事情:
它將你的project的包放到sys.path中
它將DJANGO_SETTINGS_MODULE環境變數設定為了你的project的setting.py檔案的位置。
如果你是通過setup.py工具來安裝Django的,那麼django-admin.py指令碼應該在你的系統目錄中。如果不存在,你可以到你的python安裝目錄下的site-package/django/bin中去找找看。
通常來說,如果你經常是在一個獨立的Django project裡工作,那麼使用manage.py會更方便一些。但如果你有很多Django project,那麼可以使用django-admin.py,同時需要經常變更DJANGO_SETTINGS_MODULE或使用–settings選項來設定不同的setting.py。
本文中都會使用django-admin.py來給大家做示範,但所有的例子,都也可以使用manage.py來實現。
【用法】
djang-admin.py的文法為:
django-admin.py [options]manage.py [options]
其中,subcommand是子命令;options是可選的,可以有0個到多個option。
獲得協助的方法是使用help這個命令,共有兩種方法:
1 運行django-admin.py help會顯示用法資訊,並給出所有可用的subcommand列表
2 運行django-admin.py help 會顯示特定的subcommand的描述資訊,以及所有可用的options
運行django-admin.py –version可以顯示django的版本號碼。
如果使用django-admin.py時加入–verbosity,則會顯示大量通知資訊和調試資訊。
【runfcgi】- subcommand
用於啟動一個支援FastCGI協議的進程,以便接收WebServer發來的請求。可以使用flup作為Python FastCGI模組。
runfcgi的選項如下:
- protocol:用於設定所使用的cgi協議,包括fcgi、scgi和ajp等,預設是fcgi。
- host:用於設定監聽所在的主機名稱
- port:用於設定監聽的連接埠
- socket:用於設定監聽的UNIX socket
- method:可以設定為prefork或threaded。預設是prefork。
- maxrequests:一個子進程所能處理的請求的最大數量。一旦超過此數量,則子進程會被kill掉,並建立一個新進程。設定為0意味著對子進程無限制。
- maxspare:空閑進程/線程的最大數量
- minspare:空閑進程/線程的最小數量
- maxchildren:進程/線程數的硬限制值
- daemonize:為boolean值,表示是否放到後台運行。
- pidfile:設定一個檔案,用於將產生的PID資訊寫入。
- workdir:用於設定工作目錄
- debug:為boolean值,用於設定是否開啟flup的資訊跟蹤
- outlog:用於設定將標準輸出寫入到的檔案
- errlog:用於設定將標準錯誤輸出寫入到的檔案
- umask:用於設定在進程運行時所用的umask。預設是022.
舉例來說:
django-admin.py runfcgi socket=/tmp/fcgi.sock method=prefork daemonize=true \ pidfile=/var/run/django-fcgi.pid
此命令用於在後台啟動fastCGI,並將pid寫入檔案中。
【runserver】- subcommand
用於在本機啟動一個輕量級的Web server。預設情況下,這個server會在127.0.0.1上監聽8000連接埠。你也可以傳入參數來改變預設配置。
如果你並非特權使用者,那麼你所設定的連接埠號碼不能低於1024,因為小於1024的連接埠已經被系統預定了。
一定不要用這個輕量級Server作為你的生產環境下的Server,因為它只能用於開發自測階段。它既沒有安全審計功能,而且又是單線程的。
另外,每來一個請求,Web Server都會從新載入一遍Python代碼,因此如果你的代碼有改動,不需要重啟Web Server即可生效。
你可以在一個project中啟動多個fastcgi server,只要設定不同的連接埠就可以了。
如果你設定的IP為預設的127.0.0.1,那麼你只能從原生瀏覽器來登入瀏覽,無法從其他機器來訪問。為了能讓其他機器瀏覽本機,需要將IP設定為目標機器的IP或者0.0.0.0(IPv4地址)或::(IPv6地址)。
在指定IP地址時,也可以使用主機名稱或網域名稱來代替。
【shell】- subcommand
用於開啟一個Python解譯器。
Django預設會使用IPython或bpython。但如果你沒有安裝它們或者就是要使用簡裝版的話,可以加上–plain選項,即:
django-admin.py shell --plain
【startapp】- subcommand
在當前路徑或指定目錄下建立一個Django app的檔案夾結構。
預設情況下,檔案夾中會包括module.py檔案和其他必備檔案。
如下命令用於在特定目錄下建立一個app:
django-admin.py startapp myapp /Users/jezdez/Code/myapp
【startproject】- subcommand
In Django, Projects can have many apps. Apps can be shared among many projects.
在目前的目錄或指定位置建立一個Django project檔案夾結構。
預設情況下,新檔案夾中會包括manage.py和一系列必備檔案。
目標位置參數是可選的參數,可以設定project所建立的路徑。
例如,如下命令可以在指定位置建立一個project:
django-admin.py startproject myproject /Users/jezdez/Code/myproject_repo
和startapp命令一樣,--template命令准許你指定一個檔案夾,檔案路徑,或者一個自訂項目模板的連結,關於對項目模板的支援可以查看startapp的文檔
下面的例子,在建立myproject項目的時候,會在指定的路徑尋找模板
django-admin.py startproject --template=/users/jezdez/code/my_project_template myproject
When Django copies the project template files, it also renders certain files through the template engine: the files whose extensions match the --extension option (py by default) and the files whose names are passed with the --name option. The template context used is:
Any option passed to the startproject command
project_name -- the project name as passed to the command
project_directory -- the full path of the newly created project
secret_key -- a random key for the SECRET_KEY setting
Please also see the rendering warning as mentioned for startapp.
syncdb
django-admin.py syncdb
這個命令將為以安裝的(INSTALLED_APPS)apps建立資料表,如果資料表還沒建立的話。
【擴充manage命令】
我們都用過Django的django-admin.py和manage.py。django-admin.py是一個命令列工具,可以執行一些管理工作,比如建立Django項目。而manage.py是在建立每個Django project時自動添加在項目目錄下的,只是對manage.py的一個簡單封裝,其功能是將Django project放到sys.path目錄中,同時設定DJANGO_SETTINGS_MODULE環境變數為當前project的setting.py檔案。
django-admin.py調用django.core.management來執行命令:
#!/usr/bin/env pythonfrom django.core import management if __name__ == "__main__": management.execute_from_command_line()
excute_from_command_line()函數會根據命令列參數解析出命令的名稱,根據命令名稱調用相應的Command執行命令。Command位於各個管理模組的commands模組下面。
所謂管理模組,是指在app模組下的名字為management的模組。Django通過django.core.management.find_management_module函數發現"管理模組":
django.core.management.find_management_module()def find_management_module(app_name): """ Determines the path to the management module for the given app_name, without actually importing the application or the management module. Raises ImportError if the management module cannot be found for any reason. """ parts = app_name.split('.') parts.append('management') parts.reverse() part = parts.pop() path = None
然後通過django.core.management.find_commands函數找到命令類。find_commands函數會在管理模組下尋找.py檔案,並將.py檔案的名稱匹配到命令名稱:
def find_commands(management_dir): """ Given a path to a management directory, returns a list of all the command names that are available. Returns an empty list if no commands are defined. """ command_dir = os.path.join(management_dir, 'commands') try: return [f[:-3] for f in os.listdir(command_dir) if not f.startswith('_') and f.endswith('.py')] except OSError: return []
最後,通過django.core.management.load_command_class函數載入該.py檔案中的Command類:
def load_command_class(app_name, name): """ Given a command name and an application name, returns the Command class instance. All errors raised by the import process (ImportError, AttributeError) are allowed to propagate. """ module = import_module('%s.management.commands.%s' % (app_name, name)) return module.Command()
在執行命令的時候,會執行相應Command類的handle方法。所有的Command類都應該是django.core.management.base.BaseCommand的直接或間接子類。
原理搞清楚了,擴充manage命令就很容易了。建立一個app並加入到settings的INSTALLED_APPS中,在該app下面建立management.commands模組,並建立hello.py檔案:
from django.core.management.base import BaseCommand, CommandErrorfrom django.db import models#from placeholders import *import os class Command(BaseCommand): def handle(self, *args, **options): print 'hello, django!'
就可以使用hello命令了:
$ python manage.py hellohello, django!