在使用三神裝的時候,首先固然是得要導入它們:
from django.shortcuts import HttpResponse, render, redirect
1、HttpRequest捕獲請求
捕獲請求——HttpRequest對象
一、屬性
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
二、方法
HttpRequest.get_host()#返回請求的原始主機
HttpRequest.get_full_path()#返回path,若是能夠將加上查詢字符串
HttpRequest.read(size=None)
HttpRequest.readline()
HttpRequest.readlines()
HttpRequest.xreadlines()
HttpRequest.__iter__()
#這幾個方法實現類文件的接口用於讀取HttpRequest.示例。這使得能夠用流的方式讀#取進來的請求,一個常見的用例是使用迭代解析器處理大型XML有效載荷,
而不是內存#中構造一個完整的XML樹。
三、詳解
每當一個用戶請求發送過來,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.一、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/'
2、HttpResponseWeb響應
Web響應——HttpResponsehtml
它是做用是內部傳入一個字符串參數,而後發給瀏覽器。
例如:
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。
一、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頁面,只能在瀏覽器中打開。移動互聯網下的移動設備端是沒法處理的。因此傳輸字典對象的形式更爲流行。
3、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函數。
一、調用全局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對象。
二、在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)) # 渲染視圖
4、redirect重定向
接受一個URL參數,表示讓瀏覽器跳轉去指定的URL.
例如:
def index(request):
# 業務邏輯代碼
return redirect("https://blog.csdn.net/miaoqinian")