Django簡介
django是一個開放源代碼的Python web應用框架。采用MTV模式,即模型M,模板T和視圖V。他最初是被開發用于管理勞倫斯出版社集團下的一些以新聞內容為主的網站,即:CMS(內容管理系統)軟甲。并于2005年七月在BSD許可證下發布,并于2008年九月發布了第一個正式版本1.0。這套框架是以比利時的吉普賽爵士吉他手Django Reinhardt來命名的。
MVC和MTV
MVC并不是一種技術,而是一種開發模式,一種軟件的設計典范。將一套業務分到不同的層次來處理,這樣降低了代碼的耦合度,并提高了代碼的可重用性。
MVC開始是存在于桌面程序中的,M是指業務模型,V是指用戶界面,C則是控制器,使用MVC的目的是將M和V的實現代碼分離,從而使同一個程序可以使用不同的表現形式。比如一批統計數據可以分別用柱狀圖、餅圖來表示。C存在的目的則是確保M和V的同步,一旦M改變,V應該同步更新。
Django其實就是一個基于MVC構造的框架。但是在Django中,控制器接受用戶輸入的部分由框架自行處理,所以 Django 里更關注的是模型(Model)、模板(Template)和視圖(Views),所以就稱為 MTV模式。MTV模式不過就是MVC模式的一種衍生體。
對于模型、視圖、模板我會在以后的文章中做詳細介紹,本篇文章的主要目的是認識了解Django,并搭建起Django的開發環境。
Django安裝
在安裝django之前,請確保已經安裝了Python,但是更要注意的是一定要明確使用的django的版本和Python的版本是否兼容,因為Python2在2020年1月就已經不在支持,所以建議學習與使用Python3,使用Django-1.11.x長期支持版本。
# 使用如下的命令對django的指定版本安裝,如果我們想安裝最新版只需要執行pip install django命令即可。
PS C:\Users\admin> pip install django==1.11.11
...
# 當我們安裝完畢之后,我們在控制臺輸入python命令進入到Python控制臺
PS C:\Users\admin> python
# 在python的交互界面下引入django模塊,并獲取版本信息,如果以下兩個命令能夠正確執行,則表示我們的django安裝成功了
>>> import django
>>> django.get_version()
使用Django構建web工程
使用框架最重要的一點就是構建工程,把整體框架搭建完成之后,明確了開發流程,其實寫代碼都是一些簡單的工作。好了,過多的廢話不說,我們撈干的來。
創建工程
創建一個我們的工程,這個工程就是存儲我們以后所有的代碼的地方,一定要挑一個好地方放哦。
我就將他放到D盤的根目錄下吧。在windows的控制臺下執行以下的命令,當執行命令后什么狀態都沒有的時候,你應該慶幸,你是對的,你的工程已經成功的創建了。你會在D盤下找到剛剛創建的工程的目錄。
PS C:\Users\admin> D:
PS D:\> django-admin startproject djangoProject
PS D:\>
你可以進入到工程的目錄下執行Tree . /F命令,來查看這個目錄的結構:
PS D:\> cd djangoProject
PS D:\djangoProject> Tree . /F
文件夾 PATH 列表
卷序列號為 00000029 EC57:1624
D:\DJANGOPROJECT
│ manage.py
│
└─djangoProject
settings.py
urls.py
wsgi.py
__init__.py
PS D:\djangoProject>
此時所創建的所有文件都是這個工程的配置文件,比如說,注冊一個app,添加靜態資源,配置數據庫信息等等。
創建應用
那么,問題來了,我們在哪里寫我們的代碼?。课腋嬖V你,在每一個應用中。那應用又在哪里呢?我告訴你,自己創建去。那怎么創建呢?來吧,看代碼:
執行以下的創建APP的代碼時,我們一定要進入到我們創建的工程目錄下。
PS D:\djangoProject> python manage.py startapp firstApp
PS D:\djangoProject>
shell就是這個特點,成功了,不會給你任何提示,就是這樣偷偷的帥著。就這樣,我們就帥帥的將名為firstApp的應用創建出來了。此時工程的目錄結構是這樣的:
PS D:\djangoProject> Tree . /F
文件夾 PATH 列表
卷序列號為 00000029 EC57:1624
D:\DJANGOPROJECT
│ manage.py
│
├─djangoProject
│ │ settings.py
│ │ urls.py
│ │ wsgi.py
│ │ __init__.py
│ │
│ └─__pycache__
│ settings.cpython-36.pyc
│ __init__.cpython-36.pyc
│
└─firstApp
│ admin.py
│ apps.py
│ models.py
│ tests.py
│ views.py
│ __init__.py
│
└─migrations
__init__.py
此時,你還別高興的太早,因為現在只是像應用的樣子,還并不是一個真正的應用,我們需要在工程的配置文件(settings.py)中把這個應用注冊進去。在INSTALLED_APPS配置中把我們的應用的名稱添加進去,這樣就完美了。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'firstApp',
]
配置數據庫
對于一個站點來說,后臺數據庫的支撐那是至關重要的,沒有數據庫的數據,我們拿什么去渲染前臺的數據。所以,配置數據庫是一個非常神圣的工作,django默認的數據庫是sqlite3,但是在實際開發中幾乎不會使用他,我們使用MySQL。既然要使用MySQL,那么就要先在你的機器上安裝MySQL(本文不介紹MySQL的安裝方式)。
配置MySQL我們需要三步:
第一步:安裝MySQL驅動,Python3使用的MySQL驅動是pymysql
PS D:\djangoProject>pip install pymysql
第二步:配置settings.py文件
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql',
'NAME': 'epoch',
'USER': 'root',
'PASSWORD': 'admin',
'HOST': 'localhost',
'PORT': '3306',
}
}
各個參數的介紹:
ENGINE:數據庫驅動,標志著使用的是什么數據庫。
HOST:數據庫所在主機的IP
PORT:數據庫所監聽的端口,MySQL默認監聽3306
USER:數據庫的操作用戶
PASSWORD:數據庫操作用戶的密碼
NAME:所使用的數據庫實例名稱。(此時一定要將NAME中配置的數據庫創建出來)
第三步:在settings.py文件同級目錄下的__init__.py文件中添加以下兩行代碼
import pymysql
pymysql.install_as_MySQLdb()
但是,為了一會看我們的數據庫是否配置成功,我們添加以下幾行代碼,這樣在我們啟動服務器的時候,會在控制臺中打印出數據庫的版本信息。
# 打開數據庫連接
db = pymysql.connect('localhost', 'root', 'admin', 'epoch')
# db = pymysql.connect(host="localhost", user="root", password="admin", db="epoch", port=3306)
# 使用cursor()方法獲取操作游標
cursor = db.cursor()
# 使用 executor()方法執行SQL語句
cursor.execute("SELECT VERSION()")
# 使用fetchone()獲取一條數據庫
data = cursor.fetchone()
print("Database version : %s " % data)
# 關閉數據庫連接
db.close()
配置模板目錄
對于后臺的一些配置我們都已經配置完畢了,那么問題又來了,我們的前臺頁面的代碼寫在哪里呢?別著急,這就說給你聽。
在Django中,HTML頁面這一部分內容統一稱為模板,模板的作用就是將后臺傳遞過來的數據渲染出來,展示給用戶的。配置模板目錄需要以下兩步:
第一步:創建模板目錄
在我們的工程目錄下創建一個名為templates的目錄,當然了,你可以使用別的名字,但是,約定俗成,都叫做這個名字了。
PS D:\djangopProject> mkdir templates
第二步:配置模板目錄
將我們在上一步中創建的目錄配置到settings.py文件中TEMPLATES配置項中的DIRS中,這個配置是一個list,我們可以再里邊配置多個路徑。代碼結構如下:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
配置靜態資源目錄
我們使用的靜態資源(js,css,圖片,json文件,字體文件等等),又該放在哪里呢?接下來,我們來配置靜態資源。配置靜態資源目錄兩步走:
第一步:創建靜態資源目錄
在我們的工程目錄下創建一個名為static的目錄,當然了,你可以使用別的名字,但是,約定俗成,都叫做這個名字了。
PS D:\djangoProject> mkdir static
第二步:配置靜態資源目錄
打開settings.py文件,你會發現,在文件的最后一行中已經為我們配置好了STATIC_URL的目錄為static了,但是為了以后在頁面中使用動態鏈接(鏈接分為靜態鏈接和動態鏈接,在后面的使用中我會做詳細的介紹)時,我們在該配置的下邊再添加一行配置:
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]
這個配置也是一個list,我們可以配置多個。
細心的人會發現我在整個配置過程中,還沒有啟動過服務,你如何知道配置的對不對啊,確實,我也不知道對不對,實踐是檢驗真理的唯一標準。那我們就啟動一下服務器吧:
PS D:\djangoProject> python manage.py runserver
此時如果沒有報錯,在瀏覽器中通過訪問http://127.0.0.1:8000可以訪問到如下的頁面內容,證明我們啟動成功。
It worked!
Congratulations on your first Django-powered page.
Next, start your first app by running python manage.py startapp [app_label].
Youre seeing this message because you have DEBUG = True in your Django settings file and you havent configured any URLs. Get to work!
剛剛的啟動頂多也就能看一看我們啟動時沒有報錯,就證明我們寫的還沒有違背django的配置規范。如何證明可以訪問數據庫進行數據的處理呢,那就得寫一些額外的代碼,但是如果寫過多的代碼來驗證,那么就影響了整個配置過程的清晰思路。
下面就讓我們用實踐來檢驗一下我們配置的正確與否。
從頭到尾寫套增刪改查
因為絕大部分的系統都是有操作用戶的,所以我們以用戶表的增刪改查來驗證配置的正確與否!
我們在前面說到過,我們所寫的業務代碼都是在應用(APP)中寫的,而且在前面我們也創建了一個名為firstApp的應用,我們接下來就在這里寫我們的代碼。
創建模板
我們之前簡單的提過HTML頁面就是就是模板,就是用數據渲染后,給人看的東西。因此我們首先要在模板目錄下創建一個HTML文件,我們就叫做user.html
在該文件中簡單的添加以下幾行內容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>操作用戶表</title>
</head>
<body>
<h2>操作用戶表</h2>
<form method="POST" action="#">
用戶名:<input type="text" name="username" />
<br>
密 碼:<input type="password" name="passwd" />
<br>
<button>添加</button>
</form>
</body>
</html>
但是此時你啟動服務器還是原來的那個歡迎頁面,我們如何能夠在我訪問站點的根路徑時,自動跳轉到我寫的頁面呢?我們就需要創建一個視圖了。
創建視圖
在我們的firstApp目錄下有一個views.py文件,這個文件中就是寫我們的視圖的地方。我們在該文件中添加以下幾行內容:
def user(request):
return render(request, 'user.html')
創建完視圖后,你仔細一想,還是不對啊,我怎么讓我訪問的某一個url找到指定的視圖呢?這就需要配置url分發器了。
添加URL
在與settings.py文件的同級目錄中有一個urls.py文件,這個文件就是url分發器。我們需要在里面的urlpatterns配置項中添加以下內容:
from firstApp import views
urlpatterns = [
url(r'^$', views.user),
url(r'^admin/', admin.site.urls),
]
此時我們啟動服務器,就可以看到我們剛剛創建的HTML頁面了。
添加模型
接下來,我們應該定義一個模型(model),一個模型就是一個類,這個類就封裝了一張數據庫表而已,用于做數據庫的初始化以及表的增刪改查。
在我們創建的firstApp目錄下有一個models.py文件,我們就在這個文件中定義模型,定義模型需要引入django.db中的models(應用中默認是已經引入的),模型類要繼承models.Model類。我們以創建一個簡單的用戶模型為例,代碼如下:
from django.db import models
# Create your models here.
class User(models.Model):
username = models.CharField(max_length=20)
passwd = models.CharField(max_length=16)
你先不需要關注這些代碼是什么意思,只需要知道,這個模型有兩個字段,與數據庫中的某一張表是對應的關系就好,當你去訪問數據庫的時候,你會發現創建了好多張表,你根本就沒有找到將User的這張表,為什么呢?因為默認情況下,django生成數據表的格式是appName_modelNmae.我們在后期的內容會做詳細的介紹。
模型遷移
我們把模型定義完了還不夠,我們需要將這個模型在數據庫中生成一張表,那我們該如何做呢?分以下兩步走:
第一步:生成遷移文件
我們的工程目錄下執行以下命令:
PS D:\djangoProject> python manage.py makemigrations
Database version : 5.5.53
Migrations for 'firstApp':
firstApp\migrations\0001_initial.py
- Create model User
PS D:\djangoProject>
第二步:執行遷移
在執行完上一步后,只是生成了一個遷移文件,此時還沒有在數據庫中創建表,我們需要執行以下命令來生成數據表:
PS D:\djangoProject> python manage.py migrate
Database version : 5.5.53
Operations to perform:
Apply all migrations: admin, auth, contenttypes, firstApp, sessions
Running migrations:
Applying firstApp.0001_initial... OK
PS D:\djangoProject>
對用戶表進行操作
前面的所有步驟都執行完成后,我們的整體框架算是完整了,接下來,我們進行一些數據的增刪改查吧。
添加用戶
我們在前文中已經添加了一個類似于登錄頁面的一個模板,我們就用這個頁面中的兩個字段進行添加操作。
首先我們在該模板中的form表單中的action屬性中,添加一個url,但是這時候我們還沒有url,所以,這就需要我們隨心所欲的設計了,看我的代碼吧:
user.html模板代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>操作用戶表</title>
</head>
<body>
<h2>操作用戶表</h2>
<form method="POST" action="add/">
{% csrf_token %}
用戶名:<input type="text" name="username" />
<br>
密 碼:<input type="password" name="passwd" />
<br>
<button>添加</button>
</form>
</body>
</html>
urls.py文件中的urlpatterns中添加url
urlpatterns = [
url(r'^$', views.user),
url(r'^add/$', views.add),
url(r'^admin/', admin.site.urls),
]
此時views下的add方法還不存在,我們需要在firstApp/views.py文件中添加add方法。
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def user(request):
return render(request, 'user.html')
def add(request):
username = request.POST.get('username')
passwd = request.POST.get('passwd')
print(username,passwd)
return HttpResponse('添加成功!')
運行服務器,在表單中輸入內容,點擊添加,如果在頁面中顯示添加成功并在后臺打印出你輸入的內容,即表示該步驟是正確的。
PS D:\djangoProject> python manage.py runserver
Database version : 5.5.53
Database version : 5.5.53
Performing system checks...
System check identified no issues (0 silenced).
April 03, 2018 - 08:45:26
Django version 1.11.10, using settings 'djangoProject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
Database version : 5.5.53
Performing system checks...
admin ASDF
[03/Apr/2018 08:48:34] "POST /add/ HTTP/1.1" 200 15
最后一步,我們需要對模型進行操作了,這一步需要在views.py文件中引入當前目錄下的models中的User類,將接收到的前臺的數據添加到User對象中,然后執行save()添加操作。代碼如下:
from django.shortcuts import render
from django.http import HttpResponse
from . models import User
# Create your views here.
def user(request):
return render(request, 'user.html')
def add(request):
name = request.POST.get('username')
password = request.POST.get('passwd')
user = User()
user.username = name
user.passwd = password
user.save()
return HttpResponse('添加成功!')
啟動服務器,重新執行添加操作,如果成功了,去查看數據庫,你會發現表中多了一條你剛剛插入的數據。
查詢所有用戶
有了上一步添加操作的范本,我們就可以模仿著做一個查詢的操作了。
首先是根據我們的功能來自己設計一個url,此時我們的urls.py中的urlpatterns的配置是這樣的:
from django.conf.urls import url
from django.contrib import admin
from firstApp import views
urlpatterns = [
url(r'^$', views.user),
url(r'^add/$', views.add),
url(r'^getAllUser/$', views.getAllUser),
url(r'^admin/', admin.site.urls),
]
但是我們url所指向的views下的getAllUser視圖方法還不存在,需要我們去創建該方法并在該視圖方法中引入當前文件夾下的models類,再實現查詢的業務邏輯。代碼如下:
def getAllUser(request):
userList = User.objects.all()
return render(request, 'userList.html',{'users':userList})
你會發現我們的userList.html還沒有創建,那就在模板目錄下創建一個吧,并在文件中添加以下代碼,我們將用戶的id和用戶名顯示在前臺??创a吧:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>用戶列表</title>
</head>
<body>
<ul>
{% for user in users %}
<li>{{user.pk}}----{{user.username}}</li>
{% endfor %}
</ul>
</body>
</html>
此時,你又會有一個疑惑,我們的模型中沒有pk這個字段啊,他是哪里出來的???這個是id,是模型在創建的時候自動生成的一個字段。在模型篇中,我們會做相應的講解。
好了,我們啟動服務器,訪問一下http://127.0.0.1:8000/getAllUser這個url吧。如果你在頁面中看到你在數據庫中插入的所有的用戶信息,證明你可以慶祝一下了。
細心的人可能會發現,我在做插入和查詢的時候,我的操作順序是不同的,我不是說查詢就要這個順序,插入就是這個順序,這個還是要根據自己的思路來的。在現實的開發中,一般都是從前往后想,從后往前做。
聲明一下:在接下來的修改和刪除,為了簡單我就不寫模板頁面了,但是在現實的工作中,這些操作一定是從前臺來操作的。
修改用戶
修改用戶和插入用戶的方法是相同的,都是從前臺將數據傳到后臺,再到后臺將數據庫中的數據進行修改
定義url,在urls.py文件中的urlpatterns配置中添加以下的配置,想用什么url自己隨心所欲嘍。
url(r'^updateUser/$', views.updateUser),
定義視圖并完成數據的處理
def updateUser(request):
# 查詢出用戶表中的第一個用戶
upUser = User.objects.first()
# 將該用戶密碼進行重新賦值
upUser.passwd = '123456'
# 將修改后的對象再重新save到數據庫中
upUser.save()
# 如果沒有錯誤返回添加成功的字樣
return HttpResponse('修改成功')
現在我們訪問http://127.0.0.1:8000/updateUser的時候就可以將第一個用戶的密碼修改為123456了,如果我們創建了模板,只需要將表單中修改的數據傳到后臺處理一下就可以了。
刪除用戶
刪除用戶和修改用戶的操作步驟是一樣的。
定義url,在urls.py文件中的urlpatterns配置中添加以下的配置。
url(r'^deleteUser/$', views.deleteUser),
定義視圖并完成數據的處理
def deleteUser(request):
user = User.objects.get(id='2')
user.delete()
return HttpResponse('刪除成功')
現在我們訪問http://127.0.0.1:8000/deleteUser的時候就可以將id為2的用戶刪除掉了。
企業級改造
到這里,我們我Django框架就算搭建和驗證完成了,同時也了解了基本的開發流程,但是企業開發過程中會在這個基礎上還是會有很多擴展和改變的。下面我們就對他進行一下改造。
urls改造
我們現在是將所有的url都寫在了工程的增提配置中的urls.py文件中了,這樣做其實是不合理的,有以下幾點原因:
- 實際的開發中可能會有幾十甚至幾百個url,如果都寫在一個文件中對于維護來說,簡直不堪設想;
- 實際的開發中是多個人同時進行的,很難保證你們的url沒有沖突(雖然概率很小);
- 對于團隊開發的版本控制系統,如果都寫在一個文件中,大家都來修改避免不了會有沖突。
因此,我們可以使用一下的方式進行改造:
1、在app目錄下創建屬于app自己的urls.py文件
進入到你所開發的app下,創建一個urls.py文件
我的工程名叫djangoProject,放在了D盤的根目錄下
為了展示方便,我使用命令行操作的,你完全可以使用圖形界面,我只是閑截圖上傳太麻煩了,而且這樣看著也更加清晰。
PS C:\Users\admin> D:
PS D:\> cd djangoProject
PS D:\djangoProject> cd firstApp
PS D:\djangoProject\firstApp> new-item urls.py
目錄: D:\djangoProject\firstApp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2018/4/13 10:53 0 urls.py
PS D:\djangoProject\firstApp>
2、將app的urls.py文件引入到工程的全局urls.py文件中
工程的全局配置文件都在工程目錄下的與工程名同名的目錄下
在該文件中引入from django.conf.urls import include ,并在urlpatterns配置中添加url(r'^', include('firstApp.urls', namespace='first_app'))配置,修改后的內容如下:
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('firstApp.urls', namespace='first_app'))
]
3、在firstApp的urls.py文件中引入相應的模塊和添加該app中隊醫的所有url
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.user),
url(r'^add/$', views.add, name='addUser'),
url(r'^getAllUser/$', views.getAllUser, name='getAllUser'),
url(r'^updateUser/$', views.updateUser, name='updateUser'),
url(r'^deleteUser/$', views.deleteUser, name='deleteUser'),
]
namespace和name的配置是用來配置動態url的。在以后的視圖篇再做詳細的分享。
此時你可以啟動服務了,如果能夠正常訪問,證明的的改造已經成功了。
業務處理改造
在前文的內容中,我們做的增刪改查都是在視圖層進行對模型的直接操作,如果說業務比較復雜內容比較多的時候,這個文件會比較大,代碼找起來也是很費勁。所以我們要對其進行改造。
1、我們在firstApp下新建一個service.py文件。
PS D:\djangoProject> cd firstApp
PS D:\djangoProject\firstApp> new-item service.py
目錄: D:\djangoProject\firstApp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2018/4/13 11:21 0 service.py
PS D:\djangoProject\firstApp>
2、在該文件中引入當前目錄下的models模塊中的User模型,并添加處理代碼。
我們以改造查詢所有用戶的方法來進行演示,其他的可以自行改造哦
代碼如下:
from . models import User
class FirstAppService:
def getAllUserService(self):
return User.objects.all()
當然也可以不去創建類,直接定義方法,但是這樣處理的話,我們容易出現和視圖中的方法調用沖突。還有就是我們需要記住方法名,如果創建類的話,我們通過點方法提示就可以一目了然了。具體喜歡哪一種根據個人喜好了。
3、在視圖中引入該service模塊下的FirstAppService類,通過類來調用方法。
代碼如下:
from . service import FirstAppService
def getAllUser(request):
# userList = User.objects.all()
userList = FirstAppService.getAllUserService()
return render(request, 'userList.html',{'users':userList})
好了,業務處理也改造完了,可以啟動訪問一下試一試了。
小結
到這里,我們我Django框架就算搭建和驗證完成了,同時也了解了基本的開發流程,但是開發過程中會在這個基礎上還是會有很多擴展和改變的,這些內容我會在以后的分享中不斷的完善。
好了,本期的內容就到這里。我會不斷的去更新和修改我的文檔。我們下一期的內容是“Django模板層的擴展“,如果您看到我的文章,希望您給出一些評價和指點,我會進行修改學習,更希望看到這篇文章的你在學習與工作的路上一天比一天優秀。