前言
- 推薦使用 virtualenv 建立 python 虛擬環境,防止因為使用 pip 安裝依賴到全域性引起版本衝突的問題,PyCharm 預設會生成一個
venv
目錄並建立虛擬環境,使用 IDE 自帶的終端也會預設啟用虛擬環境 - 使用的教程基於 Django 1.9.8,現在 Django 已經升級到了 2.0.3,所以可能會有部分寫法不太常見
-
涉及到的知識:
- 初始化專案
- 註冊專案
- database 配置
- 生成 Django 預設表,沒有配置 model
- view 和 template 配置
- url 配置(包括配置 name)
- 靜態檔案路徑配置
基礎環境
- Pycharm 2018
- Django 2.0.3
- Python 3.6.4
- mxonline start 分支
- Python升級3.6 強力Django+殺手級Xadmin打造線上教育平臺
目錄結構
初始結構
直接採用 PyCharm 初始化一個 Django 專案
.
├── db.sqlite3 # 預設的 sqlite 資料庫檔案
├── manage.py # 啟動指令碼
├── mxoline # 主要配置存放路徑
│ ├── __init__.py
│ ├── settings.py # 全域性配置
│ ├── urls.py # url 配置檔案
│ └── wsgi.py
└── templates # html 檔案模板
新建 app
$ django-admin startapp message
生成的 app 結構:
└── message
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
新建其他目錄
- log:存放 log 日誌
- static:存放靜態資源
- media:存放使用者上傳的媒體檔案
最終的專案結構
防止專案過大的時候,app 過多難以管理
.
├── apps # app 集中存放,防止當專案規模變大難以管理
│ └── message # 新建的 message app
├── db.sqlite3 # 預設的 sqlite 資料庫
├── log # 存放 log 日誌
├── manage.py # 啟動指令碼
├── media # 使用者上傳的媒體檔案
├── mxoline # 專案主要配置目錄
│ ├── __init__.py # 初始化檔案
│ ├── __pycache__ #
│ ├── settings.py # django 框架全域性配置檔案
│ ├── urls.py # url 對映關係配置檔案
│ └── wsgi.py #
├── static # 靜態資原始檔
├── templates # 模板存放目錄
└── venv # PyCharm 建立的虛擬 Python 環境
├── bin
├── include
├── lib
├── pip-selfcheck.json
└── pyvenv.cfg
專案初體驗
註冊專案
每次建立一個 App,我們都需要在 settings.py
中進行註冊:
# {BASE_DIR}/mxonline/settings.py
INSTALLED_APPS = [
`django.contrib.admin`,
`django.contrib.auth`,
`django.contrib.contenttypes`,
`django.contrib.sessions`,
`django.contrib.messages`,
`django.contrib.staticfiles`,
`apps.message`
]
可以看到在列表中新增了 message
專案。
配置資料庫
預設使用的是 sqlite
,我們在這裡使用 mysql
(有坑預警,昨天晚上查了好久)
進入 setting
檔案,預設的配置情況是這個樣子的:
# {BASE_DIR}/mxonline/settings.py
DATABASES = {
`default`: {
`ENGINE`: `django.db.backends.sqlite3`,
`NAME`: os.path.join(BASE_DIR, `db.sqlite3`),
}
}
修改成這個樣子:
# {BASE_DIR}/mxonline/settings.py
DATABASES = {
`default`: {
`ENGINE`: `django.db.backends.mysql`, # 使用mysql引擎
`NAME`: `test_django`, # 資料庫名稱
`USER`: `root`, # 使用者
`PASSWORD`: `root`, # 密碼
`HOST`: `127.0.0.1` # 地址
}
}
然後需要安裝 mysql
的驅動,mac 下會出現裝不上的情況,具體可以參考這裡,自行修改 mysql-config
檔案。
# 這裡是 mac 的驅動,使用Windows 同學對不起啊。
$ pip install mysqlclient
Windows 上需要自行下載 mysql-python 驅動,好像也挺多坑的,按下不表。
生成資料表
在 Pycharm
中,點選 Tools
中的 Run manage.py Task
,然後就可以在裡邊快捷的執行 manage.py
提供的各種指令碼了。
如果在命令列中執行的話,需要在下面的命令前邊加上 python manage.py
$ makemigrations
$ migrate
輸出大概如下:
bash -cl "/Users/zhoubao/workplace/python/mxoline/venv/bin/python /Applications/PyCharm.app/Contents/helpers/pycharm/django_manage.py migrate /Users/zhoubao/workplace/python/mxoline"
(B[mTracking file by folder pattern: migrations
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
可以登入自己的 mysql 資料庫檢視一下是不是生成了一堆資料表:
$ mysql -uroot -proot
$ change test_django
$ show tables;
我這裡的輸出是這個樣子的:
+----------------------------+
| Tables_in_test_django |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
10 rows in set (0.00 sec)
當然可以使用 Navicat 進行檢視,這裡就不截圖了。
檢視歡迎頁面
runserver
然後可以訪問 127.0.0.1:8000,檢視是否進入了 django 的預設歡迎頁面。
新建 templates
先在 templates
中新增一個 form.html
檔案(也算是懶到家了,就直接用 curl 拉取了)
$ cd templates
$ curl -L https://raw.githubusercontent.com/missxiaolin/python-django/1860df7790a5daefafd2c052c1e3afedbbc48151/templates/mesage_form.html > message_form.html
在 app 中新建 view
在這裡指定 view 和 template 的關係,預設的 templates 目錄就是 {BASE_DIR}/templates
# {BASE_DIR}/apps/message/views.py
from django.shortcuts import render
def getForm(request):
return render(request, `message_form.html`)
為 template 建立 url 對映
目的是將剛才的 form.html
頁面呈現出來。
進入生成專案的時候生成的和專案名稱相同的那個目錄下邊的 urls.py
檔案中,和 settings.py
檔案同級,檔案已經配置好了 /admin
路由:
# {BASE_DIR}/mxonline/urls.py
from django.contrib import admin
from django.urls import path
urlpatterns = [
path(`admin/`, admin.site.urls),
]
需要新增自己的配置項,這裡和 1.9.8 不太一樣,不需要使用正則,正則對應的是 re-path
:
# {BASE_DIR}/mxonline/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path(`admin/`, admin.site.urls),
path(``, include(`message.urls`))
]
app 內部維護 url 檔案
這裡的處理方式和教程中的不太一樣,首先教程基於的是 Django 的 1.9.8 版本,配置路由需要使用到正規表示式相關的知識。其次教程在這裡對 app 中的 url 進行了處理,我選擇的方式則是在 app 自己的目錄中維護自己的 url。
$ cd apps/message
$ touch urls.py
# {BASE_URL}/apps/message/urls.py
from django.urls import path
from . import views
urlpatterns = [
path(``, views.getForm, name="go_form")
]
在這裡可以指定一個 name
引數,這個引數在後邊會非常有用,因為在 template
中可以通過 name
來指定 url
。
解決模組引用問題
在配置完成 url 之後,執行 runserver
之後(或者在命令列中執行 python manage.py runserver
),會報錯:
ModuleNotFoundError: No module named `message`
意思是找不到名字叫 message
的這個模組。
因為我們的 message
app 之前已經被我們放到了 apps
目錄下,所以我們的解決方法會有兩種:
不更改 settings.py
如果不想要修改 settings.py
的話,我們在每次引用 apps
下面的應用的話,需要指定路徑。所以修改檔案如下:
# {BASE_DIR}/mxonline/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path(`admin/`, admin.site.urls),
path(``, include(`apps.message.urls`))
]
這樣雖然能用,但是每次都需要寫 apps
,不太方便。
將 apps 設定為模組路徑
這樣 Django 就會在 apps
中去尋找 message
模組(app)了:
# {BASE_DIR}/mxonline/settings.py
import sys
sys.path.insert(0, os.path.join(BASE_DIR, `apps`))
這裡我選擇的是第二種處理方式。
這樣我們點選進去 127.0.0.1:8000 就應該能看到 message_form.html
頁面檔案了。
解決 CSS 路徑不正確的問題
在進入頁面的時候,我們會發現 css 檔案的路徑不正確,所以需要在 settings.py
檔案中設定 static
路徑。
靜態資源路徑可以有多個,所以這裡使用一個列表進行配置:
# {BASE_DIR}/mxonline/settings.py
STATICFILES_DIRS = [
os.path.join(BASE_DIR,`static`)
]
再次進入 127.0.0.1:8000,完美~
後記
現在只涉及到了專案的配置和一些基礎的配置,沒有涉及到 Django 請求從開始到完成的任何內容。下篇教程將集中進行記錄。