Django後端如何傳值?來看看Django視圖中這些實用的方法吧。Django視圖進階篇! ✧*。٩(ˊᗜˋ*)و✧*。 Django初體驗


如果你是抱着觀看Django後端如何傳值的疑問觀看此博客,建議直接拉到最下方看JsonResponse對象使用方法,查看此方法需要一定的django基礎

常用請求方法

  1. GET請求:GET請求一般用來向服務器索取數據,但不會向服務器提交數據,不會對服務器的狀態進行更改。比如向服務器獲取某篇文章的詳情。
  2. POST請求:POST請求一般是用來向服務器提交數據,會對服務器的狀態進行更改。比如提交一篇文章給服務器。

上述兩種是當前適用範圍最廣的兩種請求,接下來我們會做一些限制請求的方法都使用上述兩種請求進行演示

限制請求

當使用函數的方式創建視圖時,我們需要限制請求就只能通過裝飾器來完成,這時候我們就需要引入裝飾器
from django.views.decorators.http import require_http_methods
此庫中最常用的幾個方法和作用分別爲

  1. require_http_methods(): 可以將限制訪問,只允許裝飾器中給定的方法訪問, 如@require_http_methods(["GET", "POST"]) 只允許get與post方法訪問頁面
  2. require_GET: 相當於@require_http_methods(["GET"])
  3. require_POST: 相當於@require_http_methods(["POST"])
  4. require_safe: 安全請求,當前請求方式中只有GET和HEAD兩種請求不會傳入數據,可以算是安全請求,所以這個就相當於@require_http_methods(["GET", "HEAD"])
    效果如下圖
# @ require_GET
@require_http_methods(['POST', 'GET'])
def home(request):
    if request.method == 'GET':
        return render(request, 'home.html')
    elif request.method == 'POST':
        return HttpResponse('當前爲POST訪問頁面')

在這裏插入圖片描述
上述的限制請求的方法是針對函數視圖的,下方我會將如何創建類視圖,在類視圖中限制請求實現較函數要簡單一些。

頁面重定向

重定向分爲永久性重定向和暫時性重定向,在頁面上體現的操作就是瀏覽器會從一個頁面自動跳轉到另外一個頁面。比如用戶訪問了一個需要權限的頁面,但是該用戶當前並沒有登錄,因此我們應該給他重定向到登錄頁面。

  • 永久性重定向:http的狀態碼是301,多用於頁面永久性的廢棄使用。
  • 暫時性重定向:http的狀態碼是302,多用於由於權限不足而進行的頁面的暫時性跳轉。
    在這裏插入圖片描述
    如何在Django中實現當前的頁面重定向呢.其實也很簡單,不過我們需要引入一個庫
    from django.shortcuts import redirect
    而redirect()中有一個屬性permanent決定是否爲永久重定向,這個屬性默認爲Flast(非永久重定向)
from django.shortcuts import render, redirect, reverse


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


def per_red(request):
    # reverse爲反向解析,在urls.py中的路由中可以設置每個路由的名字,而這裏就可以寫入設置的名字用來解析
    return redirect(reverse('高級視圖:首頁'), permanent=True)


def red(request):
    return redirect(reverse('高級視圖:首頁'))

在這裏插入圖片描述

HttpRequest對象

Django在接收到http請求之後,會根據http請求攜帶的參數以及報文信息創建一個WSGIRequest對象,並且作爲視圖函數第一個參數傳給視圖函數。也就是我們經常看到的request參數。在這個對象上我們可以找到客戶端上傳上來的所有信息。這個對象的完整路徑是django.core.handlers.wsgi.WSGIRequest。
接下來來詳細查看一下request中到底都有哪些屬性與方法:

request常用屬性

request常用屬性 作用
path 請求服務器的完整“路徑”,但不包含域名和參數。比如http://www.baidu.com/xxx/yyy/,那麼path就是/xxx/yyy/。
method 代表當前請求的http方法。比如是GET還是POST。
GET 一個django.http.request.QueryDict對象。操作起來類似於字典。這個屬性中包含了所有以?xxx=xxx的方式上傳上來的參數。
POST 也是一個django.http.request.QueryDict對象。這個屬性中包含了所有以POST方式上傳上來的參數。
FILES 也是一個django.http.request.QueryDict對象。這個屬性中包含了所有上傳的文件。
COOKIES 一個標準的Python字典,包含所有的cookie,鍵值對都是字符串類型。
session 一個類似於字典的對象。用來操作服務器的session。
META 存儲的客戶端發送上來的所有header信息。

request.META包含數據

request.META包含數據 內容
CONTENT_LENGTH 請求的正文的長度(是一個字符串)。
CONTENT_TYPE 請求的正文的MIME類型。
HTTP_ACCEPT 響應可接收的Content-Type。
HTTP_ACCEPT_ENCODING 響應可接收的編碼。
HTTP_ACCEPT_LANGUAGE 響應可接收的語言。
HTTP_HOST 客戶端發送的HOST值。
HTTP_REFERER 在訪問這個頁面上一個頁面的url。
QUERY_STRING 單個字符串形式的查詢字符串(未解析過的形式)。
REMOTE_HOST 客戶端的主機名。
REQUEST_METHOD 請求方法。一個字符串類似於GET或者POST。
SERVER_NAME 服務器域名。
SERVER_PORT 服務器端口號,是一個字符串類型。
REMOTE_ADDR 客戶端的IP地址。如果服務器使用了nginx做反向代理或者負載均衡,那麼這個值返回的是127.0.0.1,這時候可以使用HTTP_X_FORWARDED_FOR來獲取,比如下方代碼
    if 'HTTP_X_FORWARDED_FOR' in request.META:
        ip = request.META['HTTP_X_FORWARDED_FOR']
    else:
        ip = request.META['REMOTE_ADDR']

request常用方法

request常用方法 作用
.is_secure() 是否是採用https協議。
.is_ajax() 是否採用ajax發送的請求。原理就是判斷請求頭中是否存在X-Requested-With:XMLHttpRequest。
.get_host() 服務器的域名。如果在訪問的時候還有端口號,那麼會加上端口號。比如www.baidu.com:9000。
.get_full_path() 返回完整的path。如果有查詢字符串,還會加上查詢字符串。比如/music/bands/?print=True。
.get_raw_uri() 獲取請求的完整url。

HttpResponseBase對象

Django服務器接收到客戶端發送過來的請求後,會將提交上來的這些數據封裝成一個HttpRequest對象傳給視圖函數。那麼視圖函數在處理完相關的邏輯後,也需要返回一個響應給瀏覽器。而這個響應,我們必須返回HttpResponseBase或者他的子類的對象。而HttpResponse則是HttpResponseBase用得最多的子類之一,如果我們做的項目爲前後端分離,這時候我們還會經常用到JsonResponse這個數據類型用於製作端口,(JsonResponse繼承與HttpResponse)

HttpResponse對象常用屬性

  1. content:返回的內容。
    return HttpResponse('測試頁面')相當於
    返回值 = HttpResponse()
    返回值.content = '測試頁面'
    return 返回值
  1. status_code:返回的HTTP響應狀態碼。
    在這裏插入圖片描述
    大多數情況下不建議修改此值

  2. content_type:返回的數據的MIME類型,默認爲text/html。瀏覽器會根據這個屬性,來顯示數據。如果是text/html,那麼就會解析這個字符串,如果text/plain,那麼就會顯示一個純文本。常用的Content-Type如下:

    1. text/html(默認的,html文件)
      
    2. text/plain(純文本)
      
    3. text/css(css文件)
      
    4. text/javascript(js文件)
      
    5. multipart/form-data(文件提交)
      
    6. application/json(json傳輸)
      
    7. application/xml(xml文件)
      
	# 比如說純文本可以寫
	返回值.content = '尋覓'
	返回值 = HttpResponse(content_type='text/plain;charset=utf-8')
	# json可以寫,這裏我引入了 import json 庫將數據格式轉化爲json
	json返回值 = HttpResponse(content_type='application/json;charset=utf-8')
    json數據 = {
        '姓名': '尋覓',
        '年齡': 18,
    }
    json數據 = json.dumps(json數據)
    json返回值.content = json數據

在這裏插入圖片描述
4. 自定義響應頭:響應頭['鍵'] = '值'
直接使用字典的形式想響應頭中添加新的鍵值對即可
在這裏插入圖片描述

HttpResponse對象常用方法

1.set_cookie:用來設置cookie信息。
2.delete_cookie:用來刪除cookie信息。

    返回值 = HttpResponse(content_type='text/plain;charset=utf-8')
    返回值.content = '<h1>這是測試頁面</h1>'
    返回值.set_cookie('name', 'xunmi')
    # 默認會有一個防止csrf攻擊的cookie
    返回值.delete_cookie('csrftoken')
    return 返回值

在這裏插入圖片描述
3.write:HttpResponse是一個類似於文件的對象,可以用來寫入數據到數據體(content)中。
在這裏插入圖片描述

JsonResponse對象使用方法

JsonResponse對象實質上HttpResponse的子類之一,他將傳入的對象使用dump方法轉換成json字符串,然後返回將json字符串封裝成Response對象已Content-Type是application/json格式返回給瀏覽器。
JsonResponse相當於把三行優化成了一行代碼,

    json返回值 = HttpResponse(content_type='application/json;charset=utf-8')
    json數據 = json.dumps(數據)
    json返回值.content = json數據

比如說上述代碼使用JsonResponse只需寫成 json = JsonResponse(數據) 即可而且不用因爲使用json.dumps()而導入新庫
在這裏插入圖片描述
JsonResponse默認只講字典(dict)這種數據類型的格式認爲是安全格式,接收傳入,如果我們想要傳入列表或者元組等數據類型就需要將安全屬性關閉safe='False'
在這裏插入圖片描述

json轉碼

我當前使用的瀏覽器爲火狐,他有個功能會自動將我json格式中的字符轉碼,如果我們換成一個正常點的瀏覽器,會發現我們接收到的值並不是中文。這時候可以添加一個屬性將我們的值進行轉碼json_dumps_params={'ensure_ascii':False}
在這裏插入圖片描述

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