亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Django模板語法、請求與響應的案例詳解

 更新時間:2025年01月09日 10:24:42   作者:Edward-tan  
本文主要介紹了Django的模板語法、請求與響應,包括如何創(chuàng)建和渲染模板文件、傳參機制、靜態(tài)文件的引入以及如何處理GET和POST請求,通過綜合小案例,展示了如何使用Django實現(xiàn)一個簡單的登錄頁面并根據(jù)用戶名密碼進行驗證,感興趣的朋友跟隨小編一起看看

一、引言

像之前那個頁面,太過簡陋,而且一個完整的頁面,也不可能只用HttpResponse返回文本,這就可以用django的模板語法,模板語法相當于將前后端分離了,前端專寫頁面,寫成一個html文件,然后后端在視圖函數(shù)中可以通過渲染(render)將前端的html文件渲染為HTTP響應。

app文件目錄如下:

app01
│ ├─migrations
│ │ └─__pycache__
│ ├─static
│ │ ├─css
│ │ ├─img
│ │ ├─js
│ │ └─plugins
│ ├─templates
│ └─__pycache__
└─myproject
└─__pycache__

static文件夾用來存放靜態(tài)文件,包括樣式css,圖片img,網(wǎng)頁的js和插件plugins

而templayes是用來存放模板的,一些編寫的html文件通常存放于此

二、模板語法

模板語法如何實現(xiàn)呢,其實很簡單,首先得創(chuàng)建一個html文件,對網(wǎng)頁進行設計,然后在視圖函數(shù)中進行返回即可。

新建html文件:

此文件即可和前端聯(lián)系起來,可以在這兒簡單寫個頁面

<h2>展示</h2>

配置路徑

path("show/", views.show_1),

在視圖函數(shù)中返回該頁面

def show_1(request):
    return render(request, 'show_1.html')

返回頁面是用的render,第二個參數(shù)就是要顯示的html文件

啟動項目后顯示了“展示”,當然,有前端基礎的同學就可以盡情發(fā)揮,設計一個更加完善的頁面

基本功能返回指定內(nèi)容作為 HTTP 響應渲染模板文件并返回包含動態(tài)內(nèi)容的 HTTP 響應返回一個 HTTP 重定向響應,將用戶跳轉(zhuǎn)到另一個 URL
常用場景用于返回簡單的字符串、HTML 或其他內(nèi)容用于返回包含動態(tài)頁面的完整 HTML 響應用于重定向用戶到其他頁面(如成功后的跳轉(zhuǎn))
返回內(nèi)容類型文本、HTML、JSON 或其他任意內(nèi)容渲染后的 HTML 內(nèi)容重定向響應,瀏覽器跳轉(zhuǎn)到目標 URL
函數(shù)參數(shù)內(nèi)容(如字符串或 HTML 代碼)request、模板文件路徑、上下文數(shù)據(jù)(字典)URL 名稱、URL 路徑或視圖名稱
返回對象HttpResponse 對象HttpResponse 對象(經(jīng)過模板渲染的 HTML)HttpResponseRedirect 對象

三、傳參

模板文件和視圖函數(shù)可以進行相互傳參,主要通過 上下文數(shù)據(jù)(Context) 進行傳遞。以下是詳細說明:

1、視圖函數(shù)到模板文件

視圖函數(shù)傳參到模板文件只需添加一個context參數(shù)即可,并返回,context數(shù)據(jù)可包括一般的數(shù)據(jù)類型(字符串、數(shù)字、布爾值等),也可傳一些儲存數(shù)據(jù)的結(jié)構,比如列表、字典等等.

記得在render渲染器中加入context參數(shù)

def show_1(request):
    list = [1,2,3,4,5]
    dict = {'name':'zhang','age':23,'from':'China'}
    context = {
        "name":"小譚",
        "age":18,
        "ishandsome":True,
        "list":list,
        "dict":dict
    }
    return render(request, 'show_1.html', context)

在模板文件中接收到的參數(shù),可用{{ }}顯示到頁面上,字典用key值索引,列表用整數(shù)索引取值,對于列表和字典的循環(huán)索引,可以使用模板文件中的for循環(huán)。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>展示</h2>
<h2>姓名:{{name}},年齡:{{age}},帥不帥?{{ishandsome}}的</h2>
<div>
  {% for item in list %}
    <h1>{{item}}</h1>
  {% endfor %}
</div>
<ul>
    {% for k,v in dict.items %}
    <li>{{k}}={{v}}</li>
    {% endfor %}
</ul>
</body>
</html>

頁面結(jié)果:

2、模板文件到視圖函數(shù)

在定義視圖函數(shù)時的參數(shù)requests其實是一個對象,內(nèi)容包括用戶發(fā)送網(wǎng)絡請求后的一些信息,比如用戶填寫的表單等等。

這里我們新配置一個登錄的url進行演示

#添加路徑
path("login/", views.login),
#定義視圖函數(shù)
def login(request):
    return render(request, 'login.html')
 

寫一個簡單的表單

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>用戶登錄</h1>
<form action="/login/" method="post">
    #{% csrf_token %}
    <input type="text" name="user" placeholder="用戶名">
    <input type="password" name="pwd" placeholder="密碼">
    <input type="submit" value="提交"/>
</form>
</body>
</html>

啟動項目,隨便輸入一點數(shù)據(jù)

提交后會出現(xiàn)如下錯誤:

這是django獨有的安全檢測,解決方法也很簡單,只需在代碼塊中添加這個:

{% csrf_token %}

加了之后右鍵檢查網(wǎng)頁源代碼(或按F12),發(fā)現(xiàn)表單中多了一長串value,這一串碼是django內(nèi)部用來校驗是否是正常我的網(wǎng)頁發(fā)過來的,django會自動讀取,這樣就可以跳過django的安全檢測。

在視圖函數(shù)中編寫代碼,以接收并測試傳送數(shù)據(jù),因為是表單提交,所以是POST請求

def login(request):
    if request.method == 'POST':
        print(request.POST)
    return render(request, 'login.html')

在網(wǎng)頁中輸入數(shù)據(jù)并提交,發(fā)現(xiàn)控制臺會打印出剛才表單輸入的數(shù)據(jù),這其實就是requests請求的參數(shù)。

還可以通過取值獲取到這些具體的參數(shù)

username = request.POST['user']
password = request.POST['pwd']

四、引入靜態(tài)文件

之前講過一般只需要創(chuàng)建一個應用(app),但如果創(chuàng)建了多個應用,不可能每個應用創(chuàng)建一個templates,一般是整個Django項目共用一個templates,所以會在settings文件中進行配置,以讓所有應用能共用templates。

在settings文件的大概58行加入:

"DIRS": [os.path.join(BASE_DIR, "templates")],

別忘了在前面引入os庫!!

os.path.join(BASE_DIR, "templates") 的作用是將 BASE_DIR(項目的根目錄)與 templates 子目錄拼接成一個絕對路徑,告訴 Django 從這個文件夾中尋找模板文件。

靜態(tài)文件的介紹和一般存放位置前面已經(jīng)講了,現(xiàn)在來講講靜態(tài)文件在頁面中的引用

前端寫好的文件和一些img之類的,可以應用到模板中。

如果是像我之前那樣在控制臺輸入指令新建的Django文件,則用不了{% static %} 標簽。但可以用文件的相對路徑。

<img src="/static/img/picture_1.jpg" alt="">
<link rel="stylesheet" href="static/css/styles.css" rel="external nofollow" >
<script src="/static/js/jquery-3.6.0.min.js"></script>
<script src="/static/plugins/bootstrap-3.4.1/js/bootstrap.js"></script>

若是在Pycharm中創(chuàng)建的Django,可以使用{% static %} 標簽引入靜態(tài)文件

先在模板文件的頂部加入{% load static %}

引入 CSS 文件

<link rel="stylesheet" href="{% static 'css/styles.css' %}" rel="external nofollow" >

引入 JS 文件

<script src="{% static 'js/scripts.js' %}"></script>

引入圖片

<img src="{% static 'img/logo.png' %}" alt="Logo">

引入其他靜態(tài)資源

對于插件或 TypeScript 文件:

<script src="{% static 'plugins/plugin.js' %}"></script> 
<script src="{% static 'ts/script.ts' %}"></script>

但是用這個語法,要用Pycharm創(chuàng)建Django項目,而且需要用專業(yè)版的Pycharm,不然會有報錯,大家有專業(yè)版的可以用這種語法,社區(qū)版的就還是用上面的文件的相對路徑引入即可。

五、請求與響應

1、請求

用戶發(fā)送請求一般分為GET 請求和POST 請求,GET 和 POST 是 HTTP 的兩種請求方法,GET 用于從服務器獲取數(shù)據(jù),參數(shù)通過 URL 傳遞,易被緩存,適合傳遞少量、非敏感數(shù)據(jù);POST 用于向服務器提交數(shù)據(jù),參數(shù)通過請求體傳遞,適合提交表單或大數(shù)據(jù),且更安全。GET 請求參數(shù)可見,長度有限且冪等;POST 參數(shù)不可見,無長度限制,通常會修改服務器狀態(tài),不具冪等性。GET 常用于查詢操作,POST 常用于提交數(shù)據(jù)或更新操作。

查詢請求的方式:

requests.method

就對于前面寫的表單,在控制臺打印請求,就是POST請求

獲取請求的方式:

request.POST

結(jié)果是一個對象,用來獲取客戶端通過 POST 請求 提交的數(shù)據(jù)。它是一個類似字典的對象,包含了所有通過 POST 方法提交的表單數(shù)據(jù)(通常是鍵值對的形式)。

request.GET

是 Django 中用于獲取通過 GET 請求 提交的查詢參數(shù)的一個對象。它是一個類似字典的對象,包含了客戶端通過 URL 查詢字符串傳遞的所有參數(shù)。

2、響應

像上面介紹的render,還有之前的HttpResponse,還有一個redirect重定向,都是經(jīng)常用到的視圖響應函數(shù) 的工具

redirect重定向是用戶發(fā)送請求后,直接跳轉(zhuǎn)到另外的網(wǎng)址,比如百度官網(wǎng)之類的,編寫方式如下:

return redirect('https://blog.csdn.net/2403_83182682?type=blog')

第一個參數(shù)就是要跳轉(zhuǎn)的網(wǎng)址

三個響應函數(shù)的區(qū)別如下:

基本功能返回指定內(nèi)容作為 HTTP 響應渲染模板文件并返回包含動態(tài)內(nèi)容的 HTTP 響應返回一個 HTTP 重定向響應,將用戶跳轉(zhuǎn)到另一個 URL
常用場景用于返回簡單的字符串、HTML 或其他內(nèi)容用于返回包含動態(tài)頁面的完整 HTML 響應用于重定向用戶到其他頁面(如成功后的跳轉(zhuǎn))
返回內(nèi)容類型文本、HTML、JSON 或其他任意內(nèi)容渲染后的 HTML 內(nèi)容重定向響應,瀏覽器跳轉(zhuǎn)到目標 URL
函數(shù)參數(shù)內(nèi)容(如字符串或 HTML 代碼)request、模板文件路徑、上下文數(shù)據(jù)(字典)URL 名稱、URL 路徑或視圖名稱
返回對象HttpResponse 對象HttpResponse 對象(經(jīng)過模板渲染的 HTML)HttpResponseRedirect 對象
適用場景示例返回簡單消息或 API 響應:HttpResponse("Hello")返回渲染的頁面:render(request, "index.html")用戶登錄后跳轉(zhuǎn):redirect("dashboard")

六、綜合小案例

經(jīng)過前面的學習,詳細您對Django以及有了一定的了解,下面進行一個小案例。

需求是定義一個登錄頁面,用戶名或密碼輸出,會提示,正確則跳轉(zhuǎn)到一個url,內(nèi)容是所爬取的豆瓣電影排行前25。

可以就在之前的login上修改修改就行

1、源碼展示

視圖函數(shù):

def login(request):
    # 豆瓣電影前25排行
    headers = {'user-agent':
                   'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) '
                   'Version/16.6 Mobile/15E148 Safari/604.1 Edg/131.0.0.0'}
    response = requests.get("https://movie.douban.com/top250", timeout=10, headers=headers)
    response = response.text
    resp = re.findall(r'<span class="title">(?!.*&nbsp;)(?P<name>.*?)</span>', response)
    if request.method == 'POST':
        print(request.method)
        print(request.POST)
        username = request.POST['user']
        password = request.POST['pwd']
        context= {
            'name':username,
            'password':password,
            'resp':resp
        }
        if username == 'edward' and password == '1234':
            return render(request, 'douban.html',context)
        else:
            # error_msg 登錄失敗返回信息
            return render(request, "login.html", {"error_msg": "用戶名或密碼錯誤"})
    return render(request, "login.html")

登錄頁面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            flex-direction: column;
            text-align: center;
        }
        /* 調(diào)整圖片大小 */
        img {
            width: 200px;
            height: auto;
        }
        input[type="text"], input[type="password"], input[type="submit"] {
            font-size: 18px;
            padding: 10px;
            margin: 10px 0;
            width: 25%;
            box-sizing: border-box;
        }
        input[type="submit"] {
            background-color: #4CAF50;
            color: white;
            border: none;
            cursor: pointer;
        }
        input[type="submit"]:hover {
            background-color: #45a049;
        }
        span {
            font-size: 8px;
            color: red;
        }
    </style>
</head>
<body>
<h1>用戶登錄</h1>
<form action="/login/" method="post">
    {% csrf_token %}
    <input type="text" name="user" placeholder="用戶名">
    <input type="password" name="pwd" placeholder="密碼">
    <input type="submit" value="提交"/>
    <!--只有當error_msg存在時才顯示錯誤信息-->
    {% if error_msg %}
        <span style="color: red">{{ error_msg }}</span>
    {% endif %}
</form>
<img src="/static/img/picture_1.jpg" alt="">
</body>
</html>

顯示電影排行頁面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>豆瓣Top25</h1>
<div>豆瓣電影前25榜單:</div>
<ul>
    {% for item in resp%}
        <li>{{item}}</li>
    {% endfor %}
</ul>
<div>{{response}}</div>
</body>
</html>

2、注意事項以及部分解釋

注意視圖函數(shù)用了requests請求以及re解析,需在前面引入

import re
import requests

下面這段是關于網(wǎng)絡爬蟲的,有基礎的可以看看,沒基礎的直接復制就行。

headers = {'user-agent':
                   'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) '
                   'Version/16.6 Mobile/15E148 Safari/604.1 Edg/131.0.0.0'}
    response = requests.get("https://movie.douban.com/top250", timeout=10, headers=headers)
    response = response.text
    resp = re.findall(r'<span class="title">(?!.*&nbsp;)(?P<name>.*?)</span>', response)

這里的用戶名和密碼是自己設置的,一般來說,用戶名和密碼是不會出現(xiàn)在代碼中的,容易泄露,可以存放于數(shù)據(jù)庫中,但我圖方便就先這樣了,后面再出一個完整的Django和Mysql連接的博客。

if username == 'edward' and password == '1234':
            return render(request, 'douban.html',context)

html頁面做得比較簡潔,有前端基礎的同學可以試著改改,使頁面更加美觀。

3、展示

初始界面:

用戶名或密碼輸入錯誤,提示錯誤:

成功登錄,顯示排行榜:

到此這篇關于Django模板語法、請求與響應的文章就介紹到這了,更多相關Django請求與響應內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python PIL圖片添加字體的例子

    Python PIL圖片添加字體的例子

    今天小編就為大家分享一篇Python PIL圖片添加字體的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 關于Python turtle庫使用時坐標的確定方法

    關于Python turtle庫使用時坐標的確定方法

    這篇文章主要介紹了關于Python turtle庫使用時坐標的確定方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • Django表單提交后實現(xiàn)獲取相同name的不同value值

    Django表單提交后實現(xiàn)獲取相同name的不同value值

    這篇文章主要介紹了Django表單提交后實現(xiàn)獲取相同name的不同value值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 解決pytorch load huge dataset(大數(shù)據(jù)加載)

    解決pytorch load huge dataset(大數(shù)據(jù)加載)

    這篇文章主要介紹了解決pytorch load huge dataset(大數(shù)據(jù)加載)的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python3 獲取一大段文本之間兩個關鍵字之間的內(nèi)容方法

    Python3 獲取一大段文本之間兩個關鍵字之間的內(nèi)容方法

    今天小編就為大家分享一篇Python3 獲取一大段文本之間兩個關鍵字之間的內(nèi)容方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化

    Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化

    這篇文章主要介紹了Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化,Matplotlib?是?Python?中常用的?2D?繪圖庫,它能輕松地將數(shù)據(jù)進行可視化,作出精美的圖表
    2022-08-08
  • Python使用Selenium進行Web自動化測試

    Python使用Selenium進行Web自動化測試

    Selenium 是一個用于 Web 應用自動化測試的強大工具,可以用來模擬用戶操作瀏覽器,從而測試 Web 應用的功能,它支持多種瀏覽器和編程語言,包括 Python,下面我們將介紹如何使用 Selenium 進行 Web 自動化測試,需要的朋友可以參考下
    2024-08-08
  • python基礎之裝飾器詳解

    python基礎之裝飾器詳解

    這篇文章主要介紹了python基礎之裝飾器詳解,文中有非常詳細的代碼示例,對正在學習python的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-04-04
  • Django如何開發(fā)簡單的查詢接口詳解

    Django如何開發(fā)簡單的查詢接口詳解

    這篇文章主要給大家介紹了使用Django如何開發(fā)簡單的查詢接口的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Django具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • Python+PyQt手搓一個簡單的記事本

    Python+PyQt手搓一個簡單的記事本

    這篇文章主要為大家詳細介紹了Python如何結(jié)合PyQt手搓一個簡單的記事本,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-02-02

最新評論