web應用的交互過程其實就是http請求和響應的過程,咱們使用瀏覽器上網流程大體上是這樣的:html
所以,django 做爲一個 web 框架,它的使命就是處理流程中的第二步,接收瀏覽器發來的 http 請求,返回相應的 http 響應。因而引出這麼幾個問題:web
對於如何處理這些問題,django 有其自身的一套規定的機制。咱們按照 django 的規定,就能開發出咱們所需的功能。咱們先以一個最簡單的 hello world 爲例來看看 django 處理上述問題的機制是怎麼樣的。正則表達式
首先 django 須要知道當用戶訪問不一樣的網址時,應該如何處理不一樣的網址。django 的作法是把不一樣的網址對應的處理函數寫在一個 urls.py 文件裏,當用戶訪問某個網址時,django 就去會這個文件裏找,若是找到這個網址,就會調用和它綁定在一塊兒的處理函數(叫作視圖函數),下面是具體的作法,首先在 blog 應用的目錄下建立一個 urls.py 文件,這時你的目錄看起來是這樣:django
blog/ __init__.py admin.py apps.py migrations/ 0001_initial.py __init__.py models.py tests.py views.py urls.py # 新建的文件
在urls.py寫入這些代碼瀏覽器
1 from django.conf.urls import url 2 from . import views 3 4 5 urlpatterns = [ 6 # 第一個參數是網址,第二個是處理函數 7 url(r'^$', views.index, name='index') 8 ]
咱們首先從django.conf.urls 導入了url函數,從當前目錄導入了views模塊,而後咱們把網址和處理函數的關係卸載了urlpatterns列表裏。綁定關係的寫法是把網址和對應的處理函數做爲參數寫給url函數,另外傳遞了一個name參數,這個參數的值將做爲處理函數index的別名,這在之後會用到服務器
注意這裏咱們的網址是用正則寫的,django會用這個正則去匹配用戶實際輸入的網址,若是匹配成功就會調用後面的視圖函數作相應的處理,好比說咱們本地開發服務器的域名是 127.0.0.1:8000,那麼當用戶輸入網址:127.0.0.1:8000 後,django 首先會把域名(即 127.0.0.1)和端口號(8000)去掉,此時只剩下一個空字符串,而 r'^$' 的模式正是匹配一個空字符串(這個正則表達式的意思是以空字符串開頭且以空字符串結尾),因而兩者匹配,django 便會調用其對應的 views.index 函數。app
第二步就是實際編寫咱們的views.index視圖函數了,卸載views.py文件裏:框架
from django.shortcuts import render from django.http import HttpResponse # Create your views here. def index(request): return HttpResponse('Welcome to my blog home!')
前面說過,web服務器的做用就是接收來自用戶的http請求,根據請求內容作出相應的處理,並把處理結果包裝成http響應返回給用戶,這個兩行的函數體現了這個過程,它首先接受了一個request參數,這個request就是django爲咱們封裝好的http請求,他是類httpresponse的一個實例,而後咱們便直接返回了一個http響應給用戶,這個http響應也是django幫咱們封裝好的,也是類httpresponse的一個實例,只是咱們給它傳了一個自定義的字符串,用戶接受到這個響應後就會在瀏覽器顯示出咱們傳遞的內容'Welcome to my blog home!'函數
還差最後一步,咱們前面創建了一個urls.py文件,而且綁定了url和視圖函數index,可是django並不知道,django匹配url是在NewprojectBlog的urls.py下的,因此咱們要把咱們本身寫的urls.py文件包含到這個文件裏去網站
打開這個文件咱們看到如下內容
"""NewBlogProject URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.10/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), ]
咱們在urlpatterns列表中加入url(r'', include(blog.urls)),include方法須要導入,寫from django,conf.urls import include
include函數把blog應用下的urls.py包含了進來,此外include前面還有一個r'‘,這是一個空字符串,這裏也能夠寫成其它的字符串,django會把這個字符串和後面include包含的urls.py文件裏的url拼接,例如咱們把這裏的r'‘改爲r'blog/',而咱們在blog.urls中寫的url是r'^$'一個空字符串,那麼django最終匹配的就是blog/加上一個空字符串
這基本上就是django的開發流程了,寫好處理http請求和返回http響應的師徒函數,而後把視圖函數綁定到相應的url上,可是咱們在視圖函數中返回的是一個HTTPResponse類的實例,咱們給他傳入了一個咱們但願顯示在用戶瀏覽器上的字符串,可是咱們的blog不可能只顯示一句話,它有可能會顯示很長很長的內容,好比咱們發佈的博客文章列表,或者一大段的博客文字,咱們不能每次都把這些大段段的內容傳遞給HTTPResponse,因而django對這個問題提供了一個好方法,叫作模版系統,django要咱們把大段的文本寫到一個文件裏,而後本身會去讀取這個文件,django再把讀取到的內容傳遞給HTTPResponse,咱們用模版系統來改造一下上面的例子。在項目目錄裏有一個templates的文件夾,用來存放咱們的模版,而後再創建一個blog文件夾,用來存放blog應用相關的模版,淡然存放在那裏不重要,只要django找的到就行,可是這樣創建的目地是把不一樣應用用的模塊分離開來,方便維護,而後在新建的blog下創建一個index.html文件,寫下代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{{ title }}</title> </head> <body> <h1>{{ welcome }}</h1> </body> </html>
這是一個標準的html文檔,只是裏面有兩個比較奇怪的地方,{{title}}和{{welcome}},這是django規定的語法,用{{}}包起來的叫作模版變量,django在讀取這個模版的時候會根據咱們傳來的值替換這些變量,最終在模版中顯示的將會是咱們傳遞的值。
模版寫好了還得告訴django去那裏找模版,在settings.py文件裏設置一下模版文件的路徑,找到TEMPLATES選項,
blogproject/settings.py TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], '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', ], }, }, ]
其中的DIRS就是設置模版的路徑,寫入os.path.join(BASE_DIR, 'templates')
這裏的BASE_DIR是settings.py前面定義的變量,記錄的是工程目錄newprojectblog的值。在這裏目錄下有咱們的模版目錄templates,因而利用os.path.join把兩個路徑連起來,構成完整的模版路徑,django就知道去這個路徑下面找咱們的模版
視圖函數能夠改一下了
from django.shortcuts import render from django.http import HttpResponse # Create your views here. def index(request): return render(request, 'blog/index.html', context={'title': 'My blog home', 'welcome': 'Welcome to my blog!'})
這裏咱們不在是把字符串傳遞給HttpResponse了,而是調用django提供的 render函數,這個函數根據咱們傳入的參數來構造HttpResponse,咱們首先把http請求傳了進去,而後它根據第二個參數的值blog/index.html找到咱們的模版,而後讀取模版的內容,而且根據咱們傳入的context把模版中的變量替換成咱們傳遞的值,{{ title }} 被替換成了 context 字典中 title 對應的值,同理 {{ welcome }} 也被替換成相應的值。最終,咱們的 html 模板中的內容字符串被傳遞給 HttpResponse 對象並返回給瀏覽器,這樣用戶的瀏覽器上便顯示出了咱們寫的 html 模板的內容。