首頁 > 軟體

Django學習之路之請求與響應

2022-02-15 13:02:16

前言

上一章節中我們講了如何參照靜態檔案和模板,以及如何使用常見的Django命令等。那麼這章我們就來聊聊Django是如何向瀏覽器傳送資料,以及我們怎麼來接收瀏覽器返回的資料的。

請求

什麼是request

在我們的檢視函數中,每一個函數都有一個request引數,那麼這個request是什麼呢?request是一個物件,封裝了使用者通過瀏覽器或爬蟲等傳送過來的所有請求相關的資料。 注意,這裡的 request 並不是 python requests模組裡面的。

GET與POST

GET與POST都是一種請求方式,一般我們在瀏覽器輸入一個網址存取網站都是GET請求;在FORM表單中,可以通過設定Method指定提交方式為GET或者POST提交方式,其預設是GET提交方式。它們之間最直觀的區別就是GET把引數包含在URL中;POST通過request body傳遞引數,它不會作為url的一部分,不會被快取、儲存在伺服器紀錄檔、以及瀏覽器瀏覽記錄中。(一個看得到,一個看不到)

 request 有一個專門用來檢視使用者的請求方式的方法——method。現在就來驗證下吧! 我以上次的test函數為例,新增 print(request.method)語句, 它對應的網頁路徑是/hd

那麼我們點選執行後存取 http://127.0.0.1:8000/hd/

再回到我們的pycharm就能看到存取網頁使用的請求方式了,果然是get請求

 另外,我們能夠通過request.GET獲取網頁上url傳遞過來的引數。怎麼傳遞引數呢?在url後面輸入“ ?”,然後就能輸入引數了,多個引數用&連線。

 還是以剛才的 http://127.0.0.1:8000/hd/ 為例,在後面輸入?a=5&b=3變成
http://127.0.0.1:8000/hd/?a=5&b=3,最後在檢視函數test使用request.GET(GET必須大寫)方法接收,並列印結果。

 說完GET請求咱們再來結合例子說明一下POST請求。POST請求經常出現在表單中,使用時需要用method指定。我們模擬一個非常簡單的使用者註冊介面:當我們輸入完使用者名稱和密碼後,希望用兩個變數接收它,方便以後儲存到資料庫。

 先製作一個簡單的HTML頁面。當我們提交表單資料後,跳轉至/save/頁面進行儲存

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>使用者註冊</title>
</head>
<body>
<h1>使用者註冊系統</h1>
<form method="post" action="/save/">
   <p>使用者名稱:<input type="text" name="user" value="請輸入使用者名稱"></p>
    密  碼:<input type="password" name="password"></p>
   <p><input type="submit" value="註冊"></p>
</form>
</body>
</html>

接著定義兩個檢視函數,一個呼叫模板用來註冊使用者,一個用來儲存使用者資訊並提示註冊成功。

def login(request):
    return render(request, "demo.html")


def save(request):
    user = request.POST.get("user")
    pwd = request.POST.get("password")
    print(f"使用者名稱:{user},密碼:{pwd}")
    return HttpResponse("註冊成功!")

最後再新增兩個路由

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login),
    path('save/', views.save)
]

現在就能開始註冊啦!

先執行程式,然後進入http://127.0.0.1:8000/login/

輸入完使用者名稱和密碼後點選註冊,發現…被禁用了?

csrf_token

為降低安全隱患,django專門為使用者設定了一個防止跨站請求偽造(csrf)的功能——csrf_token。當在表單中用post提交資料的時候,django會去檢查是否有一個csrf的隨機字串,如果沒有就會報錯,也就是剛才出現的頁面。

因此,我們在表單中使用post傳遞資料時需要加上{% csrf_token %}這條命令。

我們加上這條命令後重新執行進入註冊網頁,發現多了一串祕鑰是之前沒有的。

再次輸入使用者名稱與密碼,然後點選註冊,就能註冊成功了!接著回到pycharm也能夠看到使用者名稱跟密碼都列印出來了

響應

常見的響應形式一般有三種HttpResponse,render,redirect。前面兩種我們已經使用過。

 HttpResponse可以返回簡單的字串

HttpResponse(content=響應體, content_type=響應體資料型別, status=狀態碼)

 render

它的作用是呼叫模板,並能通過字典向模板傳入資料。它有以下屬性:

  • request:用於生成響應的請求物件。必須要寫
  • template_name: 要使用的模板的完整名稱。 也要寫
  • context: 新增到模板上下文的一個字典. 預設是一個空字典. 如果字典中的某個值是可呼叫的, 檢視將在渲染模板之前呼叫它.
  • content_type:  生成的檔案要使用的MIME型別. 預設為DEFAULT_CONTENT_TYPE設定的值. 預設為"text/html"
  • status: 響應的狀態碼. 預設為200

重定向

我單獨把它拎出來呢是因為前面我們沒有講過重定向,因此我要舉個例子說明一下。在上面的使用者註冊系統上稍作修改:我們註冊完使用者資訊後不再提示使用者註冊成功,而是直接跳轉到登入成功後的頁面。

在檢視函數save中將原先的 return HttpResponse(“註冊成功!”) 改為 return redirect("https://www.baidu.com")。點選執行後再次進入http://127.0.0.1:8000/login/

輸入完使用者名稱密碼點選註冊後就能跳轉啦!

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!   


IT145.com E-mail:sddin#qq.com