1. 構(gòu)建實(shí)驗(yàn)環(huán)境
1.1 實(shí)驗(yàn)機(jī)的環(huán)境準(zhǔn)備
1.1.1 實(shí)驗(yàn)機(jī)系統(tǒng)規(guī)劃:
- 本次實(shí)驗(yàn)使用的系統(tǒng)版本為:
CentOS Linux release 7.6.1810 (Core)
- 實(shí)驗(yàn)用虛擬機(jī)的安裝和初始化請參見:
- 安裝過程:略
- 配置過程:請參見 《Linux-CentOS7.x_操作系統(tǒng)初始化的簡單介紹》
1.1.2 實(shí)驗(yàn)網(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í)驗(yàn)所用到的 Python 環(huán)境,安裝方法請參見:
《python-Python-安裝的簡單說明》中附B 章節(jié)
1.2.3 安裝依賴軟件
升級(jí) SQLite
詳情請參見 《附A:升級(jí) SQLite》再膳,如果不升級(jí),會(huì)報(bào)如下錯(cuò)誤
注:
如果啟動(dòng) runserver 報(bào)如下錯(cuò)誤,解決方案詳見:《附A:升級(jí) 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 新建一個(gè)項(xiàng)目
執(zhí)行如下命令沪铭,會(huì)在當(dāng)前目錄下新建一個(gè)名為 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: 一個(gè)讓你用各種方式管理 Django 項(xiàng)目的命令行工具省古。
-
mysite: 里面一層的
mysite/
目錄包含你的項(xiàng)目,它是一個(gè)純 Python 包薯酝。它的名字就是當(dāng)你引用它內(nèi)部任何東西時(shí)需要用到的 Python 包名。 (比如mysite.urls
).-
mysite/__init__.py
:一個(gè)空文件爽柒,告訴 Python 這個(gè)目錄應(yīng)該被認(rèn)為是一個(gè) Python 包吴菠。 -
mysite/settings.py
:Django 項(xiàng)目的配置文件。 -
mysite/urls.py
:Django 項(xiàng)目的 URL 聲明浩村,就像你網(wǎng)站的 “目錄”橄务。 -
mysite/wsgi.py
:作為你的項(xiàng)目的運(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 其它配置
- 更改時(shí)區(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ù)器時(shí),會(huì)報(bào)如下錯(cuò)誤:
You may need to add 'xx.xx.xx.xx' to ALLOWED_HOSTS.
- 安全設(shè)置
- SECRET_KEY:這個(gè)密匙值是 Django 網(wǎng)站安全策略的一部分刺覆。如果在開發(fā)環(huán)境中沒有包好這個(gè)密匙严肪,把代碼投入生產(chǎn)環(huán)境時(shí)最好用不同的密匙代替。
- DEBUG:這個(gè)會(huì)在 debug 日志里輸出錯(cuò)誤信息谦屑,而不是輸入 HTTP 的返回碼驳糯。在生產(chǎn)環(huán)境中,它應(yīng)設(shè)置為 false氢橙,因?yàn)檩敵龅腻e(cuò)誤信息會(huì)幫助想要攻擊網(wǎng)站的人酝枢。
3.3 新建一個(gè)應(yīng)用
在 Django 中,每一個(gè)應(yīng)用都是一個(gè) Python 包悍手,并且遵循著相同的約定帘睦。項(xiàng)目和應(yīng)用有啥區(qū)別?
- 應(yīng)用是一個(gè)專門做某件事的網(wǎng)絡(luò)應(yīng)用程序:比如博客系統(tǒng)坦康,或者公共記錄的數(shù)據(jù)庫竣付,或者簡單的投票程序。
- 項(xiàng)目則是一個(gè)網(wǎng)站使用的配置和應(yīng)用的集合滞欠。
- 項(xiàng)目可以包含很多個(gè)應(yīng)用古胆。應(yīng)用可以被很多個(gè)項(xiàng)目使用。
通過以下命令筛璧,新建一個(gè)名為 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 管理后臺(tái)站點(diǎn)
'django.contrib.auth', --> 身份認(rèn)證系統(tǒng)
'django.contrib.contenttypes', --> 內(nèi)容類型框架
'django.contrib.sessions', --> 會(huì)話框架
'django.contrib.messages', --> 消息框架
'django.contrib.staticfiles', --> 靜態(tài)文件管理框架
'polls.apps.PollsConfig', --> 新增(也可以直接簡寫成 polls)
]
... 省略 ...
其實(shí)就是導(dǎo)入的這個(gè) 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 啟動(dòng)與驗(yàn)證
至此一個(gè)開發(fā)框架就已經(jīng)搭建完成了逸绎,下面我們開始驗(yàn)證一下
運(yùn)行數(shù)據(jù)庫遷移
]# python3 manage.py makemigrations
]# python3 manage.py migrate
啟動(dòng)開發(fā)服務(wù)器妖滔,驗(yàn)證項(xiàng)目創(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 升級(jí) SQLite
查看當(dāng)前系統(tǒng)默認(rèn) SQLite 版本
]# sqlite3 --version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668
下載最新 SQLite 安裝包
寫該文檔時(shí),最新版本為 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
驗(yàn)證安裝
]# sqlite3 --version
3.29.0 2019-07-10 17:32:03 fc82b73eaac8b36950e527f12c4b5dc1e147e6f4ad2217ae43ad82882a88bfa6
附B path() 方法的簡單介紹
path() 方法可以接收4個(gè)參數(shù)曲秉,其中2個(gè)是必須的:route
和 view
,以及2個(gè)可選的參數(shù):kwargs
和 name
疲牵。
- route:
route 是一個(gè)匹配 URL 的準(zhǔn)則(類似正則表達(dá)式)承二。當(dāng) Django 響應(yīng)一個(gè)請求時(shí),它會(huì)從 urlpatterns 的第一項(xiàng)開始纲爸,按順序依次匹配列表中的項(xiàng)亥鸠,直到找到匹配的項(xiàng),然后執(zhí)行該條目映射的視圖函數(shù)或下級(jí)路由识啦,其后的條目將不再繼續(xù)匹配负蚊。因此,url 路由的編寫順序非常重要颓哮!
- view:
view 指的是處理當(dāng)前 url 請求的視圖函數(shù)家妆。當(dāng) Django 匹配到某個(gè)路由條目時(shí),自動(dòng)將封裝的 HttpRequest
對象作為第一個(gè)參數(shù)冕茅,被“捕獲”的參數(shù)以關(guān)鍵字參數(shù)的形式伤极,傳遞給該條目指定的視圖 view。
- kwargs:
任意數(shù)量的關(guān)鍵字參數(shù)可以作為一個(gè)字典傳遞給目標(biāo)視圖姨伤。
- name:
對你的 URL 進(jìn)行命名哨坪,讓你能夠在 Django 的任意處,尤其是模板內(nèi)顯式地引用它乍楚。這是一個(gè)非常強(qiáng)大的功能当编,相當(dāng)于給 URL 取了個(gè)全局變量名,不會(huì)將 URL 匹配地址寫死炊豪。
附C 配置后臺(tái)使用 Mysql 數(shù)據(jù)庫
創(chuàng)建項(xià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)比較嚴(yán)格,對 SQL 語句的健壯性要求更高串绩,比如不允許 NOT NULL 字段插入沒有默認(rèn)值的數(shù)據(jù)等缺虐。