Django---搭建一個(gè)實(shí)驗(yàn)框架的簡單說明

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

在瀏覽器中訪問如下地址

http://192.168.80.11:8000/login/

頁面返回如下內(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è)是必須的:routeview,以及2個(gè)可選的參數(shù):kwargsname疲牵。

  • 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ù)等缺虐。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市礁凡,隨后出現(xiàn)的幾起案子高氮,更是在濱河造成了極大的恐慌慧妄,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剪芍,死亡現(xiàn)場離奇詭異塞淹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)罪裹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門饱普,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人状共,你說我怎么就攤上這事套耕。” “怎么了峡继?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵冯袍,是天一觀的道長。 經(jīng)常有香客問我碾牌,道長康愤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任舶吗,我火速辦了婚禮翘瓮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘裤翩。我一直安慰自己资盅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布踊赠。 她就那樣靜靜地躺著呵扛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪筐带。 梳的紋絲不亂的頭發(fā)上今穿,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音伦籍,去河邊找鬼蓝晒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛帖鸦,可吹牛的內(nèi)容都是我干的芝薇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼作儿,長吁一口氣:“原來是場噩夢啊……” “哼洛二!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤晾嘶,失蹤者是張志新(化名)和其女友劉穎妓雾,沒想到半個(gè)月后垒迂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體机断,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毫缆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年苦丁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旺拉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谢鹊,靈堂內(nèi)的尸體忽然破棺而出留凭,到底是詐尸還是另有隱情蔼夜,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布瘤运,位于F島的核電站匠题,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梧躺。R本人自食惡果不足惜傲绣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望续搀。 院中可真熱鬧禁舷,春花似錦牵咙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吠谢。三九已至工坊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罢吃,已是汗流浹背玉掸。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留司浪,地道東北人泊业。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓啊易,卻偏偏與公主長得像吁伺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子篮奄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 已經(jīng)同步到gitbook捆愁,想閱讀的請轉(zhuǎn)到gitbook: Django 1.10 中文文檔 Let’s learn...
    leyu閱讀 1,961評(píng)論 1 8
  • Django1.11版本的官方教程翻譯窟却。 在這篇教程中昼丑,我們將設(shè)置你的數(shù)據(jù)庫,創(chuàng)建你的第一個(gè)模型夸赫,并快速介紹Dja...
    年紀(jì)大了想個(gè)名字真難閱讀 1,593評(píng)論 0 5
  • Django的來歷:python開發(fā)的! long long long years ago!勞倫斯出版集團(tuán)新聞 網(wǎng)...
    JAguys閱讀 349評(píng)論 0 0
  • 編寫你的第一個(gè)Django App茬腿,第一章 讓我們用一個(gè)示例來開始學(xué)習(xí)吧呼奢。通過這個(gè)手冊握础,我們將帶你參觀如何創(chuàng)建一個(gè)...
    轉(zhuǎn)身丶即天涯閱讀 1,743評(píng)論 0 1
  • 還想著今天是14號(hào)還是15號(hào)他匪,就沒想到今天已是16號(hào)了菇存,不知為何今天一直處于焦慮的狀態(tài),甚至有點(diǎn)見誰就想吵架的狀態(tài)...
    起風(fēng)閱讀 225評(píng)論 0 0