# Project and apps
每一個 Django project 裡面可以有多個 Django app,可以想成是類似模組的概念。在實務上,**通常會依功能分成不同 app**,方便未來的維護和重複使用。
例如,我們要做一個類似 Facebook 這種網站時,依功能可能會有以下 App:
- 使用者管理 -- accounts
- 好友管理 -- friends
- 塗鴉牆管理 -- timeline
- 動態消息管理 -- news
若未來我們需要寫個購物網站,而需要會員功能時,`accounts app` (使用者管理) 就可以被重複使用。
這一章,你會學到如何使用 Django 命令列工具建立 Django project 和一個 Django app。
### 建立 Django project
### 建立專案資料夾 -- startproject
首先,使用 `django-admin.py` 來建立第一個 Django project `mysite`:
~~~
django-admin.py startproject mysite
~~~
此時會多了一個 **mysite** 資料夾,我們切換進去
~~~
cd mysite
~~~
`startproject` 這個 Django 指令除了建立專案資料夾,也預設會建立一些常用檔案,你可以使用 `ls` 或 `dir /w` (Windows) 檢視檔案結構。
目前 project 的檔案結構如下:
~~~
mysite/
├── mysite
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
~~~
### 瞭解 Django Command
`manage.py`是 Django 提供的命令列工具,我們可以利用它執行很多工作,例如同步資料庫、建立 app 等等,指令的使用方式如下:
~~~
python manage.py <command> [options]
~~~
如果你想要了解有什麼指令可以使用,輸入`help`或`-h`指令會列出所有指令列表:
~~~
python manage.py -h
~~~
而如果想了解其中一個指令,可以在指令名字後輸入`-h`,你會看到簡單的的指令介紹以及用法說明,以`runserver`為例:
~~~
(VENV) ~/djangogirls/mysite$ python manage.py runserver -h
Usage: manage.py runserver [options] [optional port number, or ipaddr:port]
Starts a lightweight Web server for development and also serves static files.
Options:
-v VERBOSITY, --verbosity=VERBOSITY
Verbosity level; 0=minimal output, 1=normal output,
2=verbose output, 3=very verbose output
--settings=SETTINGS The Python path to a settings module, e.g.
"myproject.settings.main". If this isn't provided, the
DJANGO_SETTINGS_MODULE environment variable will be
used.
--pythonpath=PYTHONPATH
A directory to add to the Python path, e.g.
"/home/djangoprojects/myproject".
--traceback Raise on exception
--no-color Don't colorize the command output.
-6, --ipv6 Tells Django to use an IPv6 address.
--nothreading Tells Django to NOT use threading.
--noreload Tells Django to NOT use the auto-reloader.
--nostatic Tells Django to NOT automatically serve static files
at STATIC_URL.
--insecure Allows serving static files even if DEBUG is False.
--version show program's version number and exit
-h, --help show this help message and exit
~~~
### 啟動開發伺服器 -- runserver
從說明中可以知道,`runserver`會啟動一個簡單的 web server,方便於在開發階段使用:
~~~
(VENV) ~/djangogirls/mysite$ python manage.py runserver
...
Django version 1.7, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
~~~
現在打開瀏覽器輸入 [http://127.0.0.1:8000/](http://127.0.0.1:8000/) 或是 [http://localhost:8000/](http://localhost:8000/) 會看到你的 django 專案已成功在 web server 上執行
![Django startproject success](https://box.kancloud.cn/2015-08-18_55d2cc19985ca.png)
最後我們可以按下 `CTRL+C` ,關閉 web server 回到命令列。
如果無法看到成功畫面,瀏覽器上顯示錯誤訊息 - "*A server error occurred. Please contact the administrator.*",請輸入:
~~~
(VENV) ~/djangogirls/mysite$ python manage.py migrate
~~~
然後再次`runserver`啟動你的 web server,我們會在 **Django Models** 解釋`migrate`的作用。
### 建立 Django application (app)
現在,讓我們利用 `startapp` 建立第一個 Django app -- **trips**:
~~~
python manage.py startapp trips
~~~
`startapp`會按照你的命名建立一個同名資料夾和 app 預設的檔案結構如下:
~~~
trips
├── __init__.py
├── admin.py
├── migrations
├── models.py
├── tests.py
└── views.py
~~~
### 將新增的 Django app 加入設定檔
在前一個指令,我們透過 Django 命令列工具建立了 **trips** 這個 app。但若要讓 Django 知道要管理哪些 app,還需再調整設定檔。
### 新增 app
打開 *mysite/settings.py*,找到 [INSTALLED_APPS](https://docs.djangoproject.com/en/1.7/ref/settings/#std:setting-INSTALLED_APPS),調整如下:
~~~
# mysite/settings.py
...
# Application definition
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'trips',
)
~~~
請注意 app 之間有時候需要特定先後順序。在此,我們將自訂的`trips`加在最後面。
**預設安裝的 Django app**
Django 已將常用的 app 設定為 `INSTALLED_APPS` 。例如,`auth` (使用者認證)、`admin` (管理後台) ...等等,我們可依需求自行增減。
### 小結
目前為止,我們使用 `startproject` 建立了一個名為 **mysite** 的 django 專案,和一個名為 ** trips** 的 django app
~~~
mysite
├── mysite
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── trips
│ ├── __init__.py
│ ├── admin.py
│ ├── migrations
│ ├── models.py
│ ├── tests.py
│ └── views.py
└── manage.py
~~~
最後,我們回顧一下本章學到的指令
| 指令 | 說明 |
|-----|-----|
| django-admin.py **startproject***`<project_name>`* | 建立 django 專案 |
| python manage.py **-h***`<command_name>`* | 查看 django command 的使用方法 |
| python manage.py **runserver** | 啟動開發伺服器 |
| python manage.py **startapp***`<app_name>`* | 新增 django app |