Django之視圖層

来源:https://www.cnblogs.com/12345huangchun/archive/2018/12/31/10203496.html
-Advertisement-
Play Games

一、視圖函數 一個視圖函數,簡稱視圖,是一個簡單的python函數,接收web請求並返回web響應。響應可以是一張網頁的HTML內容,一個重定向,一個404錯誤等。在函數中必須寫一個request的參數,然後必須要有返回值,中間的邏輯隨便,整個函數寫在哪裡也無所謂,只要python目錄下就行,但我們 ...


  一、視圖函數

  一個視圖函數,簡稱視圖,是一個簡單的python函數,接收web請求並返回web響應。響應可以是一張網頁的HTML內容,一個重定向,一個404錯誤等。在函數中必須寫一個request的參數,然後必須要有返回值,中間的邏輯隨便,整個函數寫在哪裡也無所謂,只要python目錄下就行,但我們預設規定,視圖函數一般都寫在每個應用下麵views.py文件里。

下麵是一個返回當前時間的視圖函數

from django.shortcuts import render, HttpResponse, HttpResponseRedirect, redirect
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)
紅色部分必須要有的
request為請求對象,包含了所有的請求信息
HTTPResponse,render,redirect 都是返回的方式而已
函數名是可以隨便取的,只要和url相對應就行

  二、request請求對象

  request是Django把請求報文中的請求行、請求頭,請求體封裝成一個對象,只要用request.屬性就可以得到相應的請求值

/*

1.request.GET

  一個類似於字典的對象,包含 HTTP GET 的所有參數。詳情請參考 QueryDict 對象。

2.request.POST

  一個類似於字典的對象,如果請求中包含表單數據,則將這些數據封裝成 QueryDict 對象。

  POST 請求可以帶有空的 POST 字典 —— 如果通過 HTTP POST 方法發送一個表單,但是表單中沒有任何的數據,QueryDict 對象依然會被創建。
   因此,不應該使用 if request.POST  來檢查使用的是否是POST 方法;應該使用 if request.method == "POST"
  另外:如果使用 POST 上傳文件的話,文件信息將包含在 FILES 屬性中。
   
   註意:鍵值對的值是多個的時候,比如checkbox類型的input標簽,select標簽,需要用:
        request.POST.getlist("hobby")

3.request.body

  一個字元串,代表請求報文的主體。在處理非 HTTP 形式的報文時非常有用,例如:二進位圖片、XML,Json等。
  但是,如果要處理表單數據的時候,推薦還是使用 request.POST 。


4.request.path

  一個字元串,表示請求的路徑組件(不含功能變數名稱)。
  例如:"/music/bands/the_beatles/"

5.request.method

  一個字元串,表示請求使用的HTTP 方法。必須使用大寫。
  例如:"GET""POST"


6.request.encoding

  一個字元串,表示提交的數據的編碼方式(如果為 None 則表示使用 DEFAULT_CHARSET 的設置,預設為 'utf-8')。
   這個屬性是可寫的,你可以修改它來修改訪問表單數據使用的編碼。
   接下來對屬性的任何訪問(例如從 GET 或 POST 中讀取數據)將使用新的 encoding 值。
   如果你知道表單數據的編碼不是 DEFAULT_CHARSET ,則使用它。


7.request.META

   一個標準的Python 字典,包含所有的HTTP 首部。具體的頭部信息取決於客戶端和伺服器,下麵是一些示例:

    CONTENT_LENGTH —— 請求的正文的長度(是一個字元串)。
    CONTENT_TYPE —— 請求的正文的MIME 類型。
    HTTP_ACCEPT —— 響應可接收的Content-Type。
    HTTP_ACCEPT_ENCODING —— 響應可接收的編碼。
    HTTP_ACCEPT_LANGUAGE —— 響應可接收的語言。
    HTTP_HOST —— 客服端發送的HTTP Host 頭部。
    HTTP_REFERER —— Referring 頁面。
    HTTP_USER_AGENT —— 客戶端的user-agent 字元串。
    QUERY_STRING —— 單個字元串形式的查詢字元串(未解析過的形式)。
    REMOTE_ADDR —— 客戶端的IP 地址。
    REMOTE_HOST —— 客戶端的主機名。
    REMOTE_USER —— 伺服器認證後的用戶。
    REQUEST_METHOD —— 一個字元串,例如"GET""POST"。
    SERVER_NAME —— 伺服器的主機名。
    SERVER_PORT —— 伺服器的埠(是一個字元串)。
   從上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,請求中的任何 HTTP 首部轉換為 META 的鍵時,
    都會將所有字母大寫並將連接符替換為下劃線最後加上 HTTP_  首碼。
    所以,一個叫做 X-Bender 的頭部將轉換成 META 中的 HTTP_X_BENDER 鍵。

8.request.FILES

  一個類似於字典的對象,包含所有的上傳文件信息。
   FILES 中的每個鍵為<input type="file" name="" /> 中的name,值則為對應的數據。
  註意,FILES 只有在請求的方法為POST 且提交的<form> 帶有enctype="multipart/form-data" 的情況下才會
   包含數據。否則,FILES 將為一個空的類似於字典的對象。


9.request.COOKIES

  一個標準的Python 字典,包含所有的cookie。鍵和值都為字元串。



10.request.session

   一個既可讀又可寫的類似於字典的對象,表示當前的會話。只有當Django 啟用會話的支持時才可用。
    完整的細節參見會話的文檔。


11.request.user(用戶認證組件下使用)

  一個 AUTH_USER_MODEL 類型的對象,表示當前登錄的用戶。

  如果用戶當前沒有登錄,user 將設置為 django.contrib.auth.models.AnonymousUser 的一個實例。你可以通過 is_authenticated() 區分它們。

    例如:

    if request.user.is_authenticated():
        # Do something for logged-in users.
    else:
        # Do something for anonymous users.


       user 只有當Django 啟用 AuthenticationMiddleware 中間件時才可用。

     -------------------------------------------------------------------------------------

    匿名用戶
    class models.AnonymousUser

    django.contrib.auth.models.AnonymousUser 類實現了django.contrib.auth.models.User 介面,但具有下麵幾個不同點:

    id 永遠為None。
    username 永遠為空字元串。
    get_username() 永遠返回空字元串。
    is_staff 和 is_superuser 永遠為False。
    is_active 永遠為 False。
    groups 和 user_permissions 永遠為空。
    is_anonymous() 返回True 而不是False。
    is_authenticated() 返回False 而不是True。
    set_password()、check_password()、save() 和delete() 引發 NotImplementedError。
    New in Django 1.8:
    新增 AnonymousUser.get_username() 以更好地模擬 django.contrib.auth.models.User。

1.request.get_full_path()

  返回 path,如果可以將加上查詢字元串。

  例如:"/music/bands/the_beatles/?print=true

2,request.is_ajax()

  如果請求是通過XMLHttpRequest 發起的,則返回True,方法是檢查 HTTP_X_REQUESTED_WITH 相應的首部是否是字元串'XMLHttpRequest'。

  大部分現代的 JavaScript 庫都會發送這個頭部。如果你編寫自己的 XMLHttpRequest 調用(在瀏覽器端),你必須手工設置這個值來讓 is_ajax() 可以工作。

  如果一個響應需要根據請求是否是通過AJAX 發起的,並且你正在使用某種形式的緩存例如Django 的 cache middleware,
你應該使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 裝飾你的視圖以讓響應能夠正確地緩存。

*/

  三、響應對象

  響應對象就相當於就web請求給的web回應,響應對象主要有三種形式:HTTPResponse(),render(),redirect()

  1,HTTPResponse()

from django.shortcuts import render,HttpResponse,redirect
def func(request):
    if request.method=='GET':
        return HttpResponse('是get請求方式')
    return HttpResponse('不是get請求方式')
HTTPResponse方式只需給字元串就行

  2,render()

from django.shortcuts import render,HttpResponse,redirect
def login(request):
    if request.method=='GET':
        return render(request,'login.html')
   return HttpResponse('Error')
後面跟兩個參數,第一個必須寫request,第二個寫上一個模板,render()會做兩個事,首先幫你找到相應的模板,讀取內容,其次是解析模板中的模板語句,最後把解析後的字元串交給HTTPResponse發給瀏覽器

  3,redirect()重定向

from django.shortcuts import render,HttpResponse,redirect

def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    else:
        if request.POST.get('user')=='alex' and request.POST.get('pwd')=='123':
            return  redirect('/shouye/')
        else:
            return HttpResponse('Error')
上面代碼的功能是用戶進行登錄驗證,成功後進入首頁,但是我們用的redirect()並不會在登錄成功後直接發一個首頁的HTML文件給瀏覽器,而是給瀏覽器一個首頁的地址,要求瀏覽器馬上在給我發一個剛纔我給你的首頁地址請求,然後再把首頁的HTML文件發給瀏覽器

中間有兩次請求

301和302的區別

  301和302狀態碼都表示重定向,就是說瀏覽器在拿到伺服器返回的這個狀態碼後會自動跳轉到一個新的URL地址,這個地址可以從響應的Location首部中獲取
  (用戶看到的效果就是他輸入的地址A瞬間變成了另一個地址B)——這是它們的共同點。

  他們的不同在於。301表示舊地址A的資源已經被永久地移除了(這個資源不可訪問了),搜索引擎在抓取新內容的同時也將舊的網址交換為重定向之後的網址;

  302表示舊地址A的資源還在(仍然可以訪問),這個重定向只是臨時地從舊地址A跳轉到地址B,搜索引擎會抓取新的內容而保存舊的網址。 SEO302好於301

 

2)重定向原因:
(1)網站調整(如改變網頁目錄結構);
(2)網頁被移到一個新地址;
(3)網頁擴展名改變(如應用需要把.php改成.Html或.shtml)。
        這種情況下,如果不做重定向,則用戶收藏夾或搜索引擎資料庫中舊地址只能讓訪問客戶得到一個404頁面錯誤信息,訪問流量白白喪失;再者某些註冊了多個功能變數名稱的
    網站,也需要通過重定向讓訪問這些功能變數名稱的用戶自動跳轉到主站點等。

關於301與302
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以上為效果圖 HTML代碼: CSS樣式: jQuery代碼: jquery.js slide.js 如果感覺還不錯,麻煩給個小心心。 ...
  • 受油猴子上的作者cherry製作的“網頁滑鼠點擊特效”啟發,於是稍加修改和製作,完成了Steam Wallpaper Engine版本的桌面滑鼠點擊特效。 Steam鏈接🔗:https://steamcommunity.com/sharedfiles/filedetails/?id=1609057 ...
  • 1.mvvm和mvc區別?它和其它框架(jquery)的區別是什麼?哪些場景適合? 2.vue的優點是什麼? 3.vue.cli中怎樣使用自定義的組件?有遇到過哪些問題嗎? 4.請列舉出3個Vue中常用的生命周期鉤子函數? 5.vue如何自定義一個過濾器? ...
  • 中介者模式是用來降低多個對象和類之間的通信複雜性。這種模式提供了一個中介類,該類通常處理不同類之間的通信,並支持松耦合,使代碼易於維護。 前言 中介者模式屬於行為者模式,通過一個中介對象來封裝一些列的對象交互,使對象之間解耦和,降低系統複雜度。 類圖描述 代碼實現 1、創建中介類 2、創建實體 3、 ...
  • 祭奠碌碌無為的2018,想想其實也不算碌碌無為,至少我還搞懂了裝飾器,寫了一堆有用沒用的玩意 原來覺得裝飾器挺難的,直到2018年的最後幾天,突然就明白了,難道這就是傳說中的開天聰麽 言歸正傳,之所以覺得裝飾器難,是因為這東西不按套路出牌,希望大家看完我寫的也能在新的一年裡有所收貨吧 先說下要實現的 ...
  • 併發編程-進程 相關概念 進程 進程:正則進行的一個過程或者說一個任務,而負責執行任務的則是CPU。進程是電腦中的程式關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統基礎的結構。早期面向進程設計的電腦結構中,進程是程式的基本執行實體;在當代面向線程設計的電腦結構中 ...
  • 基於 C++ 14 原生語法,不到 100 行代碼:讓編譯器幫你寫 JSON 序列化/反序列化代碼,告別體力勞動。
  • 前言 本次分析基於 CPython 解釋器,python3.x版本 在python2時代,整型有 int 類型和 long 長整型,長整型不存在溢出問題,即可以存放任意大小的整數。在python3後,統一使用了長整型。這也是吸引科研人員的一部分了,適合大數據運算,不會溢出,也不會有其他語言那樣還分短 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...