1. 構(gòu)建實(shí)驗環(huán)境
1.1 實(shí)驗機(jī)的環(huán)境準(zhǔn)備
1.1.1 實(shí)驗機(jī)系統(tǒng)規(guī)劃:
- 本次實(shí)驗使用的系統(tǒng)版本為:
CentOS Linux release 7.6.1810 (Core)
- 實(shí)驗用虛擬機(jī)的安裝和初始化請參見:
- 安裝過程:略
- 配置過程:請參見 《Linux-CentOS7.x_操作系統(tǒng)初始化的簡單介紹》
1.1.2 實(shí)驗網(wǎng)絡(luò)規(guī)劃:
IP 地址規(guī)劃
| IP | 掩碼 | 網(wǎng)關(guān) | 用途 |
|---|---|---|---|
| 192.168.80.11 | 24 | 192.168.80.2 | Django 開發(fā)環(huán)境 |
端口規(guī)劃
| 端口 | 協(xié)議 | 用途 |
|---|---|---|
| 8000 | tcp | 開發(fā)服務(wù)器 |
1.1.3 安裝路徑規(guī)劃
/usr/local/
1.1.4 用戶規(guī)劃
| 用戶名 | 密碼 | 用途 |
|---|---|---|
1.2 軟件環(huán)境的準(zhǔn)備
1.2.1 刪除沖突軟件
無
1.2.2 安裝依賴服務(wù)
本實(shí)驗所用到的 Python 環(huán)境,安裝方法請參見:
《python-Python-安裝的簡單說明》中附B 章節(jié)
1.2.3 安裝依賴軟件
升級 SQLite
詳情請參見 《附A:升級 SQLite》,如果不升級,會報如下錯誤
注:
如果啟動 runserver 報如下錯誤,解決方案詳見:《附A:升級 SQLite》
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
1.3 獲取 Django 的安裝包
直接通過 pip 方式安裝,不需要單獨(dú)獲取安裝包
2. 安裝 Django
]# pip3 install django
查看 django 的版本
]# python3 -m django --version
2.2.4
3. 基礎(chǔ)配置 Django
3.1 新建一個項目
執(zhí)行如下命令,會在當(dāng)前目錄下新建一個名為 mysite 的目錄
]# cd /usr/local/
]# django-admin startproject mysite
]# tree
.
└── mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
2 directories, 5 files
簡單說明:
- manage.py: 一個讓你用各種方式管理 Django 項目的命令行工具。
-
mysite: 里面一層的
mysite/目錄包含你的項目,它是一個純 Python 包。它的名字就是當(dāng)你引用它內(nèi)部任何東西時需要用到的 Python 包名。 (比如mysite.urls).-
mysite/__init__.py:一個空文件,告訴 Python 這個目錄應(yīng)該被認(rèn)為是一個 Python 包。 -
mysite/settings.py:Django 項目的配置文件。 -
mysite/urls.py:Django 項目的 URL 聲明,就像你網(wǎng)站的 “目錄”。 -
mysite/wsgi.py:作為你的項目的運(yùn)行在 WSGI 兼容的 Web 服務(wù)器上的入口。
-
注:
tree 命令通常需要自行安裝,安裝命令如下:
]# yum -y install tree
3.2 全局配置
3.2.1 數(shù)據(jù)庫配置
此處使用默認(rèn)的 SQLite,因此不再額外配置
]# cd mysite/
]# vim mysite/settings.py
... 省略 ...
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
... 省略 ...
3.2.2 其它配置
- 更改時區(qū):
]# vim mysite/settings.py
... 省略 ...
LANGUAGE_CODE = 'en-us' --> 'zh-hans'
TIME_ZONE = 'UTC' --> 'Asia/Shanghai'
... 省略 ...
USE_TZ = True --> False
注1:
zh-hans:
- zh:表示語系
- hans:表示中文簡體;類似的 hant 就表示中文繁體
注2:
USE_TZ:暫缺,后補(bǔ)
- 更改訪問權(quán)限:
]# vim mysite/settings.py
... 省略 ...
ALLOWED_HOSTS = [] --> ['*']
... 省略 ...
注1:
如果不更改,使用瀏覽器訪問開發(fā)服務(wù)器時,會報如下錯誤:
You may need to add 'xx.xx.xx.xx' to ALLOWED_HOSTS.
- 安全設(shè)置
- SECRET_KEY:這個密匙值是 Django 網(wǎng)站安全策略的一部分。如果在開發(fā)環(huán)境中沒有包好這個密匙,把代碼投入生產(chǎn)環(huán)境時最好用不同的密匙代替。
- DEBUG:這個會在 debug 日志里輸出錯誤信息,而不是輸入 HTTP 的返回碼。在生產(chǎn)環(huán)境中,它應(yīng)設(shè)置為 false,因為輸出的錯誤信息會幫助想要攻擊網(wǎng)站的人。
3.3 新建一個應(yīng)用
在 Django 中,每一個應(yīng)用都是一個 Python 包,并且遵循著相同的約定。項目和應(yīng)用有啥區(qū)別?
- 應(yīng)用是一個專門做某件事的網(wǎng)絡(luò)應(yīng)用程序:比如博客系統(tǒng),或者公共記錄的數(shù)據(jù)庫,或者簡單的投票程序。
- 項目則是一個網(wǎng)站使用的配置和應(yīng)用的集合。
- 項目可以包含很多個應(yīng)用。應(yīng)用可以被很多個項目使用。
通過以下命令,新建一個名為 login 的 app
]# pwd
/usr/local/mysite
]# python3 manage.py startapp login
]# tree login/
login/
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
1 directory, 7 files
3.4 注冊 login 應(yīng)用
]# vim mysite/settings.py
... 省略 ...
# Application definition
INSTALLED_APPS = [
'django.contrib.admin', --> admin 管理后臺站點(diǎn)
'django.contrib.auth', --> 身份認(rèn)證系統(tǒng)
'django.contrib.contenttypes', --> 內(nèi)容類型框架
'django.contrib.sessions', --> 會話框架
'django.contrib.messages', --> 消息框架
'django.contrib.staticfiles', --> 靜態(tài)文件管理框架
'polls.apps.PollsConfig', --> 新增(也可以直接簡寫成 polls)
]
... 省略 ...
其實(shí)就是導(dǎo)入的這個 LoginConfig 類
]# head login/apps.py
from django.apps import AppConfig
class LoginConfig(AppConfig):
name = 'login'
3.5 創(chuàng)建首頁視圖
]# vim polls/views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("Hello, world. You're at the login page.")
3.6 鏈接 URL 映射器
創(chuàng)建 login/urls.py 文件
]# vim login/urls.py
from django.conf.urls import url
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
設(shè)置由 login 應(yīng)用管理自己的 url 規(guī)則
]# vim mysite/urls.py
... 省略 ...
from django.contrib import admin
from django.urls import path
from django.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', include('login.urls')),
]
4 啟動與驗證
至此一個開發(fā)框架就已經(jīng)搭建完成了,下面我們開始驗證一下
運(yùn)行數(shù)據(jù)庫遷移
]# python3 manage.py makemigrations
]# python3 manage.py migrate
啟動開發(fā)服務(wù)器,驗證項目創(chuàng)建成功
]# python3 manage.py runserver
注:
開發(fā)服務(wù)器默認(rèn)只能本地訪問,如果實(shí)現(xiàn)遠(yuǎn)程訪問,可以執(zhí)行以下命令
]# python3 manage.py runserver 0.0.0.0:8000
在瀏覽器中訪問如下地址
頁面返回如下內(nèi)容,說明應(yīng)用創(chuàng)建成功
Hello, world. You're at the login page.
附A 升級 SQLite
查看當(dāng)前系統(tǒng)默認(rèn) SQLite 版本
]# sqlite3 --version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668
下載最新 SQLite 安裝包
寫該文檔時,最新版本為 3.29
]# cd /usr/local/src/
]# wget https://www.sqlite.org/2019/sqlite-autoconf-3290000.tar.gz
解壓、編譯安裝
]# tar -xzf sqlite-autoconf-3290000.tar.gz
]# cd sqlite-autoconf-3290000/
]# ./configure --prefix=/usr/local/sqlite/
]# make -j$(nproc)
]# make install
更新系統(tǒng) lib 信息
]# echo '/usr/local/sqlite/lib' > /etc/ld.so.conf.d/sqlite.conf
]# ldconfig -v
替換系統(tǒng)默認(rèn)的 SQLite
]# ln -s /usr/local/sqlite/bin/sqlite3 /usr/bin/sqlite3
驗證安裝
]# sqlite3 --version
3.29.0 2019-07-10 17:32:03 fc82b73eaac8b36950e527f12c4b5dc1e147e6f4ad2217ae43ad82882a88bfa6
附B path() 方法的簡單介紹
path() 方法可以接收4個參數(shù),其中2個是必須的:route 和 view,以及2個可選的參數(shù):kwargs 和 name。
- route:
route 是一個匹配 URL 的準(zhǔn)則(類似正則表達(dá)式)。當(dāng) Django 響應(yīng)一個請求時,它會從 urlpatterns 的第一項開始,按順序依次匹配列表中的項,直到找到匹配的項,然后執(zhí)行該條目映射的視圖函數(shù)或下級路由,其后的條目將不再繼續(xù)匹配。因此,url 路由的編寫順序非常重要!
- view:
view 指的是處理當(dāng)前 url 請求的視圖函數(shù)。當(dāng) Django 匹配到某個路由條目時,自動將封裝的 HttpRequest 對象作為第一個參數(shù),被“捕獲”的參數(shù)以關(guān)鍵字參數(shù)的形式,傳遞給該條目指定的視圖 view。
- kwargs:
任意數(shù)量的關(guān)鍵字參數(shù)可以作為一個字典傳遞給目標(biāo)視圖。
- name:
對你的 URL 進(jìn)行命名,讓你能夠在 Django 的任意處,尤其是模板內(nèi)顯式地引用它。這是一個非常強(qiáng)大的功能,相當(dāng)于給 URL 取了個全局變量名,不會將 URL 匹配地址寫死。
附C 配置后臺使用 Mysql 數(shù)據(jù)庫
創(chuàng)建項目所需的數(shù)據(jù)庫 mysite
> CREATE DATABASE mysite CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)
> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysite |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
下載 python 訪問 Mysql 所需的模塊
]# pip3 install mysqlclient
編輯 settings.py 使其支持 Mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite',
'USER': 'root',
'PASSWORD': 'Emc20160',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
"init_command": "SET sql_mode='STRICT_TRANS_TABLES'",
}
}
}
注:
init_command主要是為了解決以下告警
WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/2.2/ref/databases/#mysql-sql-mode
大意就是沒有給 mysql 連接啟用嚴(yán)格模式,而嚴(yán)格模式能解決很多數(shù)據(jù)完整性問題,官方強(qiáng)烈建議開啟。
嚴(yán)格模式對于數(shù)據(jù)完整性校驗比較嚴(yán)格,對 SQL 語句的健壯性要求更高,比如不允許 NOT NULL 字段插入沒有默認(rèn)值的數(shù)據(jù)等。