Python Django 前后端數據交互 之 HttpRequest、HttpResponse、render、redirect


在使用三神裝的時候,首先當然是得要導入它們:
from django.shortcuts import HttpResponse, render, redirect
 

一、HttpRequest捕獲請求

捕獲請求——HttpRequest對象

1、屬性

HttpRequest.scheme  #一個字符串,表示請求的方案(通常是http或者https)
HttpRequest.body    #一個字節字符串,表示原始HTTP請求的正文
HttpRequest.path    #一個字符串,表示請求的頁面的完整路徑,不包含域名
HttpRequest.methed   #一個字符串,表示請求使用的HTTP方法,必須使用大寫
HttpRequest.GET      #一個類似於字典的對象,包含HTTP GET的所有參數
HttpRequest.POST     #一個包含所有給定的HTTP POST參數的類字典對象,提供了包含表單數據的請求
HttpRequest.COOKIES    #一個標准的python字典,包含所有cookie,鍵和值都為字符串
HttpRequest.FILES     #一個類似於字典的對象,包含所有的上傳文件
HttpRequest.META      #一個標准的python字典,包含所有的HTTP頭部123456789

2、方法

HttpRequest.get_host()#返回請求的原始主機
HttpRequest.get_full_path()#返回path,如果可以將加上查詢字符串
HttpRequest.read(size=None)
HttpRequest.readline()
HttpRequest.readlines()
HttpRequest.xreadlines()
HttpRequest.__iter__()
#這幾個方法實現類文件的接口用於讀取HttpRequest.示例。這使得可以用流的方式讀#取進來的請求,一個常見的用例是使用迭代解析器處理大型XML有效載荷,
而不是內存#中構造一個完整的XML樹。

3、詳解

每當一個用戶請求發送過來,Django將HTTP數據包中的相關內容,打包成為一個HttpRequest對象,並傳遞給每個視圖函數作為第一位置參數,
也就是request,供我們調用,這一過程是系統自動完成的。
例如:前台請求數據包含username和password兩個字段。例如網址http://127.0.0.1/xxxx/xxx?username=luanpeng&password=123
其中的xxx為網址映射,在urlsl路由映射部分再做詳解。
 
# 接收請求數據返回字符串響應
def index(request):
    if request.method == "POST":
        username = request.POST.get("username", None)   # 讀取post數據,None為默認值
        password = request.POST.get("password", None)   # 讀取post數據,None為默認值
    if request.method == "GET":
        username = request.GET.get("username", None)   # 讀取get數據
        password = request.GET.get("password", None)  # 讀取get數據
    ...123456789
在獲取數據時,通常會提供一個默認值,防止請求數據中沒有目標屬性時觸發KeyError異常。
不僅如此,HttpRequest對象中包含了非常多的重要的信息和數據,應該熟練掌握它。
1)HttpRequest屬性
(1)、 HttpRequest.scheme
字符串類型,表示請求的協議種類,’http’或’https’。
(2)、 HttpRequest.body
bytes類型,表示原始HTTP請求的正文。它對於處理非HTML形式的數據非常有用:二進制圖像、XML等。如果要處理常規的表單數據,應該使用HttpRequest.POST。還可以使用類似讀寫文件的方式從HttpRequest中讀取數據,參見HttpRequest.read()。
(3)、 HttpRequest.path
字符串類型,表示當前請求頁面的完整路徑,但是不包括協議名和域名。例如:”/music/bands/the_beatles/”。這個屬性,常被用於我們進行某項操作時,如果不通過,返回用戶先前瀏覽的頁面。非常有用!
(4)、 HttpRequest.path_info
在某些Web服務器配置下,主機名后的URL部分被分成腳本前綴部分和路徑信息部分。path_info 屬性將始終包含路徑信息部分,不論使用的Web服務器是什么。使用它代替path可以讓代碼在測試和開發環境中更容易地切換。
例如,如果應用的WSGIScriptAlias設置為/minfo,那么HttpRequest.path等於/music/bands/the_beatles/ ,而HttpRequest.path_info為/minfo/music/bands/the_beatles/。
(5)、HttpRequest.method
字符串類型,表示請求使用的HTTP方法。默認為大寫。 像這樣:
if request.method == 'GET':
    do_something()
elif request.method == 'POST':
    do_something_else()1234
通過這個屬性來判斷請求的方法,然后根據請求的方法不同,在視圖中執行不同的代碼。
(6)、HttpRequest.encoding
字符串類型,表示提交的數據的編碼方式(如果為None 則表示使用DEFAULT_CHARSET設置)。 這個屬性是可寫的,可以通過修改它來改變表單數據的編碼。任何隨后的屬性訪問(例如GET或POST)將使用新的編碼方式。
(7)、HttpRequest.content_type
Django1.10中新增。表示從CONTENT_TYPE頭解析的請求的MIME類型。
(8)、HttpRequest.content_params
Django 1.10中新增。包含在CONTENT_TYPE標題中的鍵/值參數字典。
(9)、HttpRequest.GET
一個類似於字典的對象,包含GET請求中的所有參數。 詳情參考QueryDict文檔。
(10)、HttpRequest.POST
一個包含所有POST請求的參數,以及包含表單數據的字典。 詳情請參考QueryDict文檔。 如果需要訪問請求中的原始或非表單數據,可以使用HttpRequest.body屬性。
注意:請使用if request.method == “POST”來判斷一個請求是否POST類型,而不要使用if request.POST。
POST中不包含上傳文件的數據。
(11)、HttpRequest.COOKIES
包含所有Cookie信息的字典。 鍵和值都為字符串。可以類似字典類型的方式,在cookie中讀寫數據,但是注意cookie是不安全的,因此,不要寫敏感重要的信息。
(12)、HttpRequest.FILES
一個類似於字典的對象,包含所有上傳的文件數據。 FILES中的每個鍵為<input type="file" name="" />中的name屬性值。 FILES中的每個值是一個UploadedFile。
要在Django中實現文件上傳,就要靠這個屬性!
如果請求方法是POST且請求的<form>中帶有enctype=”multipart/form-data”屬性,那么FILES將包含上傳的文件的數據。 否則,FILES將為一個空的類似於字典的對象,屬於被忽略、無用的情形。
下面為使用模型處理上傳的文件的一個示例。
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import ModelFormWithFileField
def upload_file(request):
    if request.method == 'POST':
        form = ModelFormWithFileField(request.POST, request.FILES)
        if form.is_valid():
            # 這么做就可以了,文件會被保存到Model中upload_to參數指定的位置
            form.save()
            return HttpResponseRedirect('/success/url/')
    else:
        form = ModelFormWithFileField()
    return render(request, 'upload.html', {'form': form})1234567891011121314
(13)、HttpRequest.META
包含所有HTTP頭部信息的字典。 可用的頭部信息取決於客戶端和服務器,下面是一些示例:

CONTENT_LENGTH —— 請求正文的長度(以字符串計)。
CONTENT_TYPE —— 請求正文的MIME類型。
HTTP_ACCEPT —— 可接收的響應Content-Type。
HTTP_ACCEPT_ENCODING —— 可接收的響應編碼類型。
HTTP_ACCEPT_LANGUAGE —— 可接收的響應語言種類。
HTTP_HOST —— 客服端發送的Host頭部。
HTTP_REFERER —— Referring頁面。
HTTP_USER_AGENT —— 客戶端的user-agent字符串。
QUERY_STRING —— 查詢字符串。
REMOTE_ADDR —— 客戶端的IP地址。想要獲取客戶端的ip信息,就在這里!
REMOTE_HOST —— 客戶端的主機名。
REMOTE_USER —— 服務器認證后的用戶,如果可用。
REQUEST_METHOD —— 表示請求方法的字符串,例如”GET” 或”POST”。
SERVER_NAME —— 服務器的主機名。
SERVER_PORT —— 服務器的端口(字符串)。

2)HttpRequest方法
(1)、HttpRequest.get_host()[source]
據HTTP_X_FORWARDED_HOST和HTTP_HOST頭部信息獲取請求的原始主機。 如果這兩個頭部沒有提供相應的值,則使用SERVER_NAME和SERVER_PORT。
例如:”127.0.0.1:8000”
注:當主機位於多個代理的后面,get_host()方法將會失敗。解決辦法之一是使用中間件重寫代理的頭部
(2)、HttpRequest.get_port()[source]
使用META中HTTP_X_FORWARDED_PORT和SERVER_PORT的信息返回請求的始發端口。
(3)、HttpRequest.get_full_path()[source]
返回包含完整參數列表的path。例如:/music/bands/the_beatles/?print=true
(4)、 HttpRequest.build_absolute_uri(location)[source]
返回location的絕對URI形式。 如果location沒有提供,則使用request.get_full_path()的值。
例如:”https://example.com/music/bands/the_beatles/?print=true”
注:不鼓勵在同一站點混合部署HTTP和HTTPS,如果需要將用戶重定向到HTTPS,最好使用Web服務器將所有HTTP流量重定向到HTTPS。
(5)、HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt=”, max_age=None)[source]
從已簽名的Cookie中獲取值,如果簽名不合法則返回django.core.signing.BadSignature。
可選參數salt用來為密碼加鹽,提高安全系數。 max_age參數用於檢查Cookie對應的時間戳是否超時。
(6)、 HttpRequest.is_secure()[source]
如果使用的是Https,則返回True,表示連接是安全的。
(7)、HttpRequest.is_ajax()[source]
如果請求是通過XMLHttpRequest生成的,則返回True。
這個方法的作用就是判斷,當前請求是否通過ajax機制發送過來的。
(8)、 HttpRequest.read(size=None)[source]
(9)、HttpRequest.readline()[source]
(10)、HttpRequest.readlines()[source]
(11)、 HttpRequest.xreadlines()[source]
(12)、 HttpRequest.iter()
上面的幾個方法都是從HttpRequest實例讀取文件數據的方法。
3)QueryDict對象
在應用中我們主要操作的就是GET和POST屬性了。這里面包含了我們想要的數據。除了從QueryDict中獲取數據,有時服務器還需要創建QueryDict對象發起向其他服務器的訪問。
在HttpRequest對象中,GET和POST屬性都是一個django.http.QueryDict的實例。也就是說你可以按本文下面提供的方法操作request.POST和request.GET。
3.1、QueryDict對象方法
QueryDict 實現了Python字典數據類型的所有標准方法,因為它是字典的子類。
不同之處在於下面:
(1)、QueryDict.init(query_string=None, mutable=False, encoding=None)[source]
QueryDict實例化方法。注意:QueryDict的鍵值是可以重復的!
QueryDict('a=1&a=2&c=3')
返回:QueryDict: {'a': ['1', '2'], 'c': ['3']}>12
(2) 、classmethod QueryDict.fromkeys(iterable, value=”, mutable=False, encoding=None)[source]
循環將可迭代對象中的每個元素作為鍵值,並賦予同樣的值(來至value參數)。
QueryDict.fromkeys(['a', 'a', 'b'], value='val')
返回:QueryDict: {'a': ['val', 'val'], 'b': ['val']}>12
(3)、 QueryDict.update(other_dict)
用新的QueryDict或字典更新當前QueryDict。類似dict.update(),但是追加內容,而不是更新並替換它們
>>> q = QueryDict('a=1', mutable=True)
>>> q.update({'a': '2'})
>>> q.getlist('a')
['1', '2']
>>> q['a'] # returns the last
'2'123456
(4)、QueryDict.items()
類似dict.items(),如果有重復項目,返回最近的一個,而不是都返回:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.items()
[('a', '3')]123
(5)、 QueryDict.values()
類似dict.values(),但是只返回最近的值。 像這樣:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.values()
['3']123
(6)、QueryDict.copy()[source]
使用copy.deepcopy()返回QueryDict對象的副本。 此副本是可變的!
(7)、QueryDict.getlist(key, default=None)
返回鍵對應的值列表。 如果該鍵不存在並且未提供默認值,則返回一個空列表。
(8)、QueryDict.setlist(key, list_)[source]
為list_設置給定的鍵。
(9)、QueryDict.appendlist(key, item)[source]
將鍵追加到內部與鍵相關聯的列表中。
(10)、QueryDict.setdefault(key, default=None)[source]
類似dict.setdefault(),為某個鍵設置默認值。
(11)、QueryDict.setlistdefault(key, default_list=None)[source]
類似setdefault(),除了它需要的是一個值的列表而不是單個值。
(12)、QueryDict.lists()
類似items(),只是它將其中的每個鍵的值作為列表放在一起。 像這樣:
>>> q = QueryDict('a=1&a=2&a=3')
>>> q.lists()
[('a', ['1', '2', '3'])]123
(13)、QueryDict.pop(key)[source]
返回給定鍵的值的列表,並從QueryDict中移除該鍵。 如果鍵不存在,將引發KeyError。 像這樣:
>>> q = QueryDict('a=1&a=2&a=3', mutable=True)
>>> q.pop('a')
['1', '2', '3']123
(14)、QueryDict.popitem()[source]
刪除QueryDict任意一個鍵,並返回二值元組,包含鍵和鍵的所有值的列表。在一個空的字典上調用時將引發KeyError。 像這樣:
>>> q = QueryDict('a=1&a=2&a=3', mutable=True)
>>> q.popitem()
('a', ['1', '2', '3'])123
(15)、QueryDict.dict()
將QueryDict轉換為Python的字典數據類型,並返回該字典。
如果出現重復的鍵,則將所有的值打包成一個列表,最為新字典中鍵的值。
>>> q = QueryDict('a=1&a=3&a=5')
>>> q.dict()
{'a': '5'}123
(16)、QueryDict.urlencode(safe=None)[source]
已url的編碼格式返回數據字符串。 像這樣:
>>> q = QueryDict('a=2&b=3&b=5')
>>> q.urlencode()
'a=2&b=3&b=5'123
使用safe參數傳遞不需要編碼的字符。 像這樣:
>>> q = QueryDict(mutable=True)
>>> q['next'] = '/a&b/'
>>> q.urlencode(safe='/')
'next=/a%26b/'
 

二、HttpResponseWeb響應

Web響應——HttpResponse

它是作用是內部傳入一個字符串參數,然后發給瀏覽器。
例如:
def index(request):
    # 業務邏輯代碼
    return HttpResponse("OK")
view視圖函數返回給前端的是HttpResponse對象,HttpResponse類定義在django.http模塊中。
HttpRequest對象由Django自動創建,而HttpResponse對象則由程序員手動創建.
我們編寫的每個視圖都要實例化、填充和返回一個HttpResponse對象。也就是函數的return值。數據表現有多種形式,可以是字符串、對象、網頁。
HttpResponse屬性

HttpResponse.content
響應的內容。bytes類型。
HttpResponse.charset
編碼的字符集。 如果沒指定,將會從content_type中解析出來。
HttpResponse.status_code
響應的狀態碼,比如200。
HttpResponse.reason_phrase
響應的HTTP原因短語。 使用標准原因短語。
除非明確設置,否則reason_phrase由status_code的值決定。
HttpResponse.streaming
這個屬性的值總是False。由於這個屬性的存在,使得中間件能夠區別對待流式響應和常規響應。
HttpResponse.closed
如果響應已關閉,那么這個屬性的值為True。


1、HttpResponse方法

1)HttpResponse.init(content=”, content_type=None, status=200, reason=None, charset=None)[source]
響應的實例化方法。使用content參數和content-type實例化一個HttpResponse對象。
content應該是一個迭代器或者字符串。如果是迭代器,這個迭代期返回的應是一串字符串,並且這些字符串連接起來形成response的內容。 如果不是迭代器或者字符串,那么在其被接收的時候將轉換成字符串。
content_type是可選地,用於填充HTTP的Content-Type頭部。如果未指定,默認情況下由DEFAULT_CONTENT_TYPE和DEFAULT_CHARSET設置組成:text/html; charset=utf-8。
status是響應的狀態碼。reason是HTTP響應短語。charset是編碼方式。
2) HttpResponse.has_header(header)
檢查頭部中是否有給定的名稱(不區分大小寫),返回True或 False。
3)HttpResponse.setdefault(header, value)
設置一個頭部,除非該頭部已經設置過了。
4)HttpResponse.set_cookie(key, value=”, max_age=None, expires=None, path=’/’, domain=None, secure=None, httponly=False)
設置一個Cookie。 參數與Python標准庫中的Morsel.Cookie對象相同。
max_age: 生存周期,以秒為單位。
expires:到期時間。
domain: 用於設置跨域的Cookie。例如domain=”.lawrence.com”將設置一個www.lawrence.com、blogs.lawrence.com和calendars.lawrence.com都可讀的Cookie。 否則,Cookie將只能被設置它的域讀取。
如果你想阻止客服端的JavaScript訪問Cookie,可以設置httponly=True。
5) HttpResponse.set_signed_cookie(key, value, salt=”, max_age=None, expires=None, path=’/’, domain=None, secure=None, httponly=True)
與set_cookie()類似,但是在設置之前將對cookie進行加密簽名。通常與HttpRequest.get_signed_cookie()一起使用。
6) HttpResponse.delete_cookie(key, path=’/’, domain=None)
刪除Cookie中指定的key。
由於Cookie的工作方式,path和domain應該與set_cookie()中使用的值相同,否則Cookie不會刪掉。
7) HttpResponse.write(content)[source]
將HttpResponse實例看作類似文件的對象,往里面添加內容。
8) HttpResponse.flush()
清空HttpResponse實例的內容。
9) HttpResponse.tell()[source]
將HttpResponse實例看作類似文件的對象,移動位置指針。
10) HttpResponse.getvalue()[source]
返回HttpResponse.content的值。 此方法將HttpResponse實例看作是一個類似流的對象。
11) HttpResponse.readable()
Django1.10中的新功能,值始終為False。
12) HttpResponse.seekable()
Django1.10中的新功能,值始終為False。
13) HttpResponse.writable()[source]
Django1.10中的新功能,值始終為True。
14) HttpResponse.writelines(lines)[source]
將一個包含行的列表寫入響應對象中。 不添加分行符。
 

2.1 返回前台字符串

Django使用HttpResponse基類返回前端字符串。簡單的返回如下
 
def test(request):
    ...
    return HttpResponse("接收數據成功")   # 直接返回響應字符串123
當我們想以字符串的形式返回我們從數據查詢到的數據集或數據對象時,可以使用序列化功能。
 
from django.core import serializers
jsonstr1 = serializers.serialize("json", dataset1)   # 將dataset轉化為json字符串
return HttpResponse(jsonstr1 )1234
我們也可以直接返回html源代碼的字符串形式,這樣前端瀏覽器就會自動渲染成頁面
 
html = "<html><body>It is now %s.</body></html>" % datetime.datetime.now()
return HttpResponse(html)12

2.2 返回前端字典

返回字典使用JsonResponse函數。
 
class JsonResponse(data,encoder = DjangoJSONEncoder,safe = True,json_dumps_params = None ,** kwargs)[source]1
JsonResponse是HttpResponse的一個子類,是Django提供的用於創建JSON編碼類型響應的快捷類。
它從父類繼承大部分行為,並具有以下不同點:
它的默認Content-Type頭部設置為application/json。
它的第一個參數data,通常應該為一個字典數據類型。 如果safe參數設置為False,則可以是任何可JSON 序列化的對象。
encoder默認為django.core.serializers.json.DjangoJSONEncoder,用於序列化數據。
布爾類型參數safe默認為True。 如果設置為False,可以傳遞任何對象進行序列化(否則,只允許dict 實例)。
 
from django.http import JsonResponse
from .models import User,Diary
from django.forms.models import model_to_dict
# 返回字典
def finduser(request):
    userid = request.POST.get("userid", None)  # 讀取數據
    users = User.objects.filter(id=userid)  # 獲取一個用戶,返回QuerySet
    user = users[0]  # 獲取第一個user對象
    user_dict1 = model_to_dict(user)  # 將對象轉化為字典
    return JsonResponse(user_dict1)  # 返回前端字典1234567891011

2.3 返回數據流

StreamingHttpResponse類被用來從Django響應一個流式對象到瀏覽器。如果生成的響應太長或者是占用的內存較大,這么做可能更有效率。 例如,它對於生成大型的CSV文件非常有用。
StreamingHttpResponse不是HttpResponse的衍生類(子類),因為它實現了完全不同的應用程序接口。但是,除了幾個明顯不同的地方,兩者幾乎完全相同。

2.4 返回文件

文件類型響應。通常用於給瀏覽器返回一個文件附件。
FileResponse是StreamingHttpResponse的衍生類,為二進制文件專門做了優化。
FileResponse需要通過二進制模式打開文件,如下:
 
from django.http import FileResponse
response = FileResponse(open('myfile.png', 'rb'))12

2.3 返回靜態html頁面

html文件被稱為視圖模板。如果需要返回html模板頁面,首先我們需要有一個html文件。我們需要在功能模塊app1文件夾下新建templates文件夾,用於存放html模板頁面。
我們在templates文件夾下創建一個insert.html模板。代碼如下
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用戶登錄</title>
</head>
<body>
    <form action="/app1/insert/" method="post">
        <input type="text" name="username"/>
        <input type="password" name="password"/>
        <input type="submit" value="提交">
    </form>
</body>
</html>1234567891011121314
有了html文件,我們在views.py文件內新建一個insertuser視圖函數,返回這個模板頁面。
 
from django.shortcuts import render_to_response,redirect
from .models import User,Diary
import time

def insertuser(request):
    return render_to_response('insert.html')  # 返回文件響應1234567

  其實,python只是加載html文件,讀取內容后,將內容返回給前台。所以是不是html格式並不重要。我們完全可以使用txt格式存儲。在views.py文件的函數中加載txt文件。


2.4 動態生成html頁面

上面的模板文件只是靜態的html文件。在views視圖函數中是不能動態修改的。如果我們想根據數據庫查詢結果動態的修改模板頁面,形成新的頁面再返回給前端怎么辦?
我們把views中的函數用於邏輯處理,把處理結果交給html模板對象,來渲染成最終形成的html頁面。這個過程我們稱為渲染視圖。
我們在templates文件夾新建另一個html文件為showuser.html。內容如下
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>信息展示</h1>
    <table>
    <tr>
        <th>用戶名</th>
        <th>密碼</th>
    </tr>
    {% for line in people_list %}
    <tr>
        <td>{{line.username}}</td>
        <td>{{line.password}}</td>
    </tr>
    {% endfor %}
    </table>
</body>
</html>12345678910111213141516171819202122
我們可以看到在html文件的代碼中包含了部分python代碼。至於則個動態模板的書寫規則以及如果使用view視圖函數傳遞的數據的,
我們在另一篇文章templates模板中再詳解。
不過這里我們需要知道在views視圖函數中如何向模板傳遞數據。
我們在views.py中實現findalluser函數,代碼如下:
 
from django.shortcuts import render_to_response
from .models import User,Diary
# findalluser將數據庫內存儲的數據讀出並展示出來。
def findalluser(request):
    allpeople = User.objects.all()  # 查詢所有用戶
    dict={
        'people_list':allpeople
    }
    return render_to_response("showuser.html",dict)  # 返回文件響應,第二個參數必須為字典12345678910
視圖函數將數據庫內存儲的數據讀出並結合html文件渲染出最后的響應html源代碼。這和jsp中的原理相同,python先將html文件的內容全部加載到內存中,
再根據python的語法和傳來的數據庫數據生成html文件中python代碼部分產生的文本,再將最終生成的html源代碼返回到前端。
注意:在向模板傳遞參數時必須以字典的形式傳遞。

  渲染的模板視圖生成的是html頁面,只能在瀏覽器中打開。移動互聯網下的移動設備端是無法處理的。所以傳輸字典對象的形式更為流行。
 

三、render

上面學習了很多返回數據類型。在實際運用中,加載模板、傳遞參數,返回HttpResponse對象是一整套再常用不過的操作了,為了節省力氣,Django提供了一個快捷方式:render函數,一步到位!

render方法可接收三個參數,一是request參數,二是待渲染的html模板文件,三是保存具體數據的字典參數。
它的作用就是將數據填充進模板文件,最后把結果返回給瀏覽器。與jinja2類似。
    render(request, template_name, context= None, content_type=None, status=None, using=None)[source]
例如:
def index(request):
    # 業務邏輯代碼
    return render(request, "index.html", {"name": "monicx", "hobby": ["reading", "blog"]})
結合一個給定的模板和一個給定的上下文字典,返回一個渲染后的HttpResponse對象。
必需參數:

request:視圖函數處理的當前請求,封裝了請求頭的所有數據,其實就是視圖參數request。
template_name:要使用的模板的完整名稱或者模板名稱的列表。如果是一個列表,將使用其中能夠查找到的第一個模板。

可選參數:

context:添加到模板上下文的一個數據字典。默認是一個空字典。可以將認可需要提供給模板的數據以字典的格式添加進去。這里有個小技巧,使用Python內置的locals()方法,可以方便的將函數作用於內的所有變量一次性添加。
content_type:用於生成的文檔的MIME類型。 默認為DEFAULT_CONTENT_TYPE設置的值。
status:響應的狀態代碼。 默認為200。
using:用於加載模板使用的模板引擎的NAME。

使用render可以同時處理請求對象request、html模板、數據庫數據。在Django中可以調用render函數,也可以在模板對象上調用render函數。
1、調用全局render函數。看如下代碼:
 
from django.shortcuts import render
from .models import User,Diary
# findalluser將數據庫內存儲的數據讀出並展示出來。
def findalluser(request):
    allpeople = User.objects.all()  # 查詢所有用戶
    dict={
        'people_list':allpeople
    }
    return render(request,'showuser.html',dict)12345678910
render()函數的第一個位置參數是請求對象(就是view函數的第一個參數),第二個位置參數是模板。還可以有一個可選的第三參數,一個字典,包含需要傳遞給模板的數據。最后render函數返回一個經過字典數據渲染過的模板封裝而成的HttpResponse對象。
2、在template模板對象上調用render函數。如下示例
 
from django.shortcuts import render,HttpResponse
def findalluser(request):
    allpeople = models.User.objects.all()  # 查詢所有用戶
    dict={
        'people_list':allpeople
    }
    template = loader.get_template('showuser.html')  # 加載模板對象
    return HttpResponse(template.render(dict1, request))  # 渲染視圖
 

四、redirect重定向

接受一個URL參數,表示讓瀏覽器跳轉去指定的URL.
例如:
def index(request):
    # 業務邏輯代碼
    return redirect("https://blog.csdn.net/miaoqinian")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM