Django學習 (三) Django 博客首頁視圖

Django 處理 HTTP 請求

Web 應用的交互過程其實就是 HTTP 請求與響應的過程。

  1. 我們打開瀏覽器,在地址欄輸入想訪問的網址,比如 https://blog.csdn.net/panjianlongWUHAN
  2. 瀏覽器知道我們想要訪問哪個網址後,它在後臺幫我們做了很多事情。主要就是把我們的訪問意圖包裝成一個 HTTP 請求,發給我們想要訪問的網址所對應的服務器。通俗點說就是瀏覽器幫我們通知網站的服務器,說有人來訪問你啦,訪問的請求都寫在 HTTP 裏了,你按照要求處理後告訴我,我再幫你迴應他!
  3. 服務器處理了HTTP 請求,然後生成一段 HTTP 響應給瀏覽器。瀏覽器解讀這個響應,把相關的內容在瀏覽器裏顯示出來,於是我們就看到了網站的內容。比如你訪問了我的博客主頁 https://blog.csdn.net/panjianlongWUHAN,服務器接收到這個請求後就知道用戶訪問的是首頁,首頁顯示的是全部文章列表,於是它從數據庫裏把文章數據取出來,生成一個寫着這些數據的 HTML 文檔,包裝到 HTTP 響應裏發給瀏覽器,瀏覽器解讀這個響應,把 HTML 文檔顯示出來,我們就看到了文章列表的內容。

Django 作爲一個 Web 框架,它的使命就是處理流程中的第二步。即接收瀏覽器發來的 HTTP 請求,返回相應的 HTTP 響應


Hello 視圖函數 

綁定 URL 與視圖函數

首先 Django 需要知道當用戶訪問不同的網址時,應該如何處理這些不同的網址(即所說的路由)。Django 的做法是把不同的網址對應的處理函數寫在一個 urls.py 文件裏,當用戶訪問某個網址時,Django 就去會這個文件裏找,如果找到這個網址,就會調用和它綁定在一起的處理函數(叫做視圖函數)。

首先在 blog 應用的目錄下創建一個 urls.py 文件

在 blog\urls.py 中寫入這些代碼

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
]

1.從 django.conf.urls 導入了 url 函數,

2.從當前目錄下導入了 views 模塊。

3.把網址和處理函數的關係寫在了 urlpatterns 列表裏

綁定關係的寫法是把網址和對應的處理函數作爲參數傳給 url 函數(第一個參數是網址,第二個參數是處理函數) 

比如說我們本地開發服務器的域名是 http://127.0.0.1:8080,那麼當用戶輸入網址 http://127.0.0.1:8080 後,Django 首先會把協議 http、域名 127.0.0.1 和端口號 8000 去掉此時只剩下一個空字符串,而 r'^$' 的模式正是匹配一個空字符串(這個正則表達式的意思是以空字符串開頭且以空字符串結尾),於是二者匹配,Django 便會調用其對應的 views.index 函數。

 

編寫視圖函數

第二步就是要實際編寫我們的 views.index 視圖函數了,按照慣例視圖函數定義在 views.py 文件裏:

from django.http import HttpResponse

def index(request):
    return HttpResponse("歡迎訪問Peter的Django博客首頁!")

Web 服務器的作用就是接收來自用戶的 HTTP 請求,根據請求內容作出相應的處理,並把處理結果包裝成 HTTP 響應返回給用戶。

1.首先接受了一個名爲 request 的參數,這個 request 就是 Django 爲我們封裝好的 HTTP 請求,它是類 HttpRequest 的一個實例

2.直接返回了一個 HTTP 響應給用戶,這個 HTTP 響應也是 Django 幫我們封裝好的,它是類 HttpResponse 的一個實例,只是我們給它傳了一個自定義的字符串參數。

 

配置項目 URL

我們前面建立了一個 urls.py 文件,並且綁定了 URL 和視圖函數 index,但是 Django 並不知道。Django 匹配 URL 模式是在 blogproject目錄下的urls.py,要把 blog 應用下的 urls.py 文件包含到 blogproject\urls.py 裏去

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'', include('blog.urls')),
]

導入了一個 include 函數,然後利用這個函數把 blog 應用下的 urls.py 文件包含了進來。此外 include 前還有一個 r'',這是一個空字符串。這裏也可以寫其它字符串,Django 會把這個字符串和後面 include 的 urls.py 文件中的 URL 拼接。比如說如果我們這裏把 r'' 改成 r'blog/',而我們在 blog.urls 中寫的 URL 是 r'^$',即一個空字符串。那麼 Django 最終匹配的就是 blog/ 加上一個空字符串,即 blog/。

 

查看返回字符串結果

 

使用 Django 模板系統

我們看到在視圖函數裏返回的是一個 HttpResponse 類的實例,我們給它傳入了一個希望顯示在用戶瀏覽器上的字符串。但是我們的博客不可能只顯示這麼一句話,它有可能會顯示很長很長的內容。比如我們發佈的博客文章列表,或者一大段的博客文章。我們不能每次都把這些大段大段的內容傳給 HttpResponse

Django 對這個問題給我們提供了一個很好的解決方案,叫做模板系統。Django 要我們把大段的文本寫到一個文件裏,然後 Django 自己會去讀取這個文件,再把讀取到的內容傳給 HttpResponse。讓我們用模板系統來改造一下上面的例子。

首先在我們的項目根目錄(即 manage.py 文件所在目錄)下建立一個名爲 templates 的文件夾,用來存放我們的模板。然後在 templates\ 目錄下建立一個名爲 blog 的文件夾,用來存放和 blog 應用相關的模板。

templates\ 目錄位於項目根目錄,而 index.html 位於 templates\blog 目錄下,而不是 blog 應用下,如果弄錯了你可能會得到一個TemplateDoesNotExist 異常。如果遇到這個異常,請回來檢查一下模板目錄結構是否正確。

<!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 文件裏設置一下模板文件所在的路徑。在 settings.py 找到 TEMPLATES 選項,其中 DIRS 就是設置模板的路徑,在 [] 中寫入 os.path.join(BASE_DIR, 'templates')。這裏 BASE_DIR 是 settings.py 在配置開頭前面定義的變量,記錄的是工程根目錄 blogproject\ 的值(注意是最外層的 blogproject\ 目錄)。在這個目錄下有模板文件所在的目錄 templates\,於是利用os.path.join 把這兩個路徑連起來,構成完整的模板路徑,Django 就知道去這個路徑下面找我們的模板了。

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',
            ],
        },
    },
]

視圖函數blog/views.py可以改一下

from django.http import HttpResponse
from django.shortcuts import render

def index(request):
    return render(request, 'blog/index.html', context={
        'title': '我的博客首頁',
        'welcome': '歡迎訪問我的博客首頁'
    })

訪問頁面

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章