blog首頁視圖

聲明:此Django分類下的教程是追夢人物全部,地址http://www.jianshu.com/u/f0c09f959299,本人寫在此只是爲了鞏固複習使用

 

django 是如何處理 http 請求的

web應用的交互過程其實就是http請求和響應的過程,咱們使用瀏覽器上網流程大體上是這樣的:html

  1. 咱們打開瀏覽器,在地址欄輸入咱們想訪問的網址,好比 www.djangoproject.com(固然你也可能從收藏夾裏直接打開網站,但本質上都是同樣的。)
  2. 瀏覽器知道咱們要訪問那個網址後,它在後臺幫咱們作了不少事,主要就是把咱們的訪問以圖包裝成一個http請求,發給咱們想要訪問的網址所對應的服務器,通俗點將就是瀏覽器幫咱們通知網站的服務器,說有人來訪問你了,訪問的請求都寫在了http裏了,你按照要求處理後告訴我,我再幫你迴應
  3. 網站服務器處理了http請求,而後生成一段http響應給瀏覽器,瀏覽器解讀這個響應,把相關內容在瀏覽器裏顯示出來,因而咱們就看到了網站的內容

所以,django 做爲一個 web 框架,它的使命就是處理流程中的第二步,接收瀏覽器發來的 http 請求,返回相應的 http 響應。因而引出這麼幾個問題:web

  1. django 如何接收 http 請求?
  2. django 如何處理這個 http 請求?
  3. django 如何生成 http 響應?

 

對於如何處理這些問題,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 模板的內容。

相關文章
相關標籤/搜索