3-Django視圖

概述

做用:視圖接收WEB請求並返回WEB響應

方法:1. FBV(function base views) 就是在視圖裏使用函數處理請求。html

​ 2. CBV(class base views) 就是在視圖裏使用類處理請求。 python

響應: 能夠是一個HTML頁面,一個重定向,一個404錯誤、一個JSON數據等等程序員

過程:ajax

clipboard.png

URLConf

clipboard.png

視圖函數

clipboard.png

HttpRequest對象

概述: 服務器接收到http協議的請求後,會根據報文建立HttpRequest對象; 視圖函數的一個形參就是HttpRequest對象

屬性

clipboard.png

方法

is_ajax(): 若是請求是經過XMLHTTPRequest類發起的,返回Trueredis

QueryDict對象
clipboard.png數據庫

GET屬性

http://127.0.0.1:8000/get1/?a=1&b=2&c=3django

def get1(request):
    a = request.GET.get("a")
    b = request.GET.get("b")
    c = request.GET.get("c")
    return HttpResponse(a+"-"+b+"-"+c)

http://127.0.0.1:8000/get2/?a=1&a=2&c=3json

def get2(request):
    alist = request.GET.getlist("a")
    c = request.GET.get("c")
    return HttpResponse(alist[0]+"-"+alist[1]+"-"+c)

POST屬性

使用表單提交,須要將settings.py文件中的'django.middleware.csrf.CsrfViewMiddleware',中間件去掉segmentfault

或者加上{%csrf_token}緩存

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>註冊</title>
</head>
<body>
    <form action="/register/" method="post">
        用戶名:
        <input type="text" name="username" value=""><hr/>
        密碼:
        <input type="password" name="passwd" value=""><hr/>
        愛好:
        <input type="checkbox" name="hobby" value="power">權利
        <input type="checkbox" name="hobby" value="money">金錢
        <input type="checkbox" name="hobby" value="book">閱讀<hr/>
        <input type="submit" value="註冊">
    </form>
</body>
</html>
#views.py
def register(request):
    if request.method == "GET":
        return render(request, "register.html")
    else:
        username = request.POST.get("username")
        passwd   = request.POST.get("passwd")
        hobbys   = request.POST.getlist("hobby")
        print(username, passwd, hobbys)
        return HttpResponse("註冊成功")

HttpResponse對象

概述: HttpRequest對象由Django自動建立的,可是HttpResponse對象由程序員建立的;存儲服務器響應給客戶端的數據

用法

clipboard.png

常見的MIME類型(通用型):

  • 超文本標記語言文本 .html text/html
  • xml文檔 .xml text/xml
  • XHTML文檔 .xhtml application/xhtml+xml
  • 普通文本 .txt text/plain
  • RTF文本 .rtf application/rtf
  • PDF文檔 .pdf application/pdf
  • Microsoft Word文件 .word application/msword
  • PNG圖像 .png image/png
  • GIF圖形 .gif image/gif
  • JPEG圖形 .jpeg,.jpg image/jpeg
  • au聲音文件 .au audio/basic
  • MIDI音樂文件 mid,.midi audio/midi,audio/x-midi
  • RealAudio音樂文件 .ra, .ram audio/x-pn-realaudio
  • MPEG文件 .mpg,.mpeg video/mpeg
  • AVI文件 .avi video/x-msvideo
  • GZIP文件 .gz application/x-gzip
  • TAR文件 .tar application/x-tar
  • 任意的二進制數據 application/octet-stream

屬性

屬性 描述
content 表示返回的內容,字符串類型
charset 表示response採用的編碼字符集,字符串類型
status_code 響應HTTP的狀態碼
content_type 指定輸出的MIME類型

方法

init: 使用頁面實例化HttpResponse對象

write(content):

# 以文件的方式寫入,將 content 寫到報文的主體中,這使得 HttpResponse 的實例相似於文件對象
def index(request):
    response = HttpResponse()
    response.content = "sunck is a good man"
    response.charset = "utf-8"
    response.write("!")
    response.write("very good!")
    return response

flush() : 以文件的方式輸出緩衝區; 在flush以後就不要在寫write了

set_cookie():
原型:set_cookie(self, key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False)

做用: 設置cookie,cookie是保存在客戶端的信息,以鍵值對的形式保存

參數:

  • key : cookie的鍵
  • value:cookie的值
  • max_age: 過時時間 單位秒
  • expires:設置過時時間 datetime.datetime 對象

示例:

def setcookie(request):
    response = HttpResponse("sunck is a handsome man")
    response.set_cookie("sunck", "good")
    return response

request.COOKIES.get("sunck")

子類HttpResponseRedirect

功能: 重定向,服務器端跳轉

實現

from django.http import HttpResponse, HttpResponseRedirect
def indexTemp(request):
    # 重定向到/index/
    return HttpResponseRedirect("/index/")

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

def indexTemp(request):
    # 重定向到/index/, HttpResponseRedirect不多用了,通常用redirect
    # return HttpResponseRedirect("/index/")
    return redirect("/index")

子類JsonResponse

返回JSON數據,通常用於異步請求

優勢: 幫助用戶建立JSON編碼響應; 參數是字典對象,若是傳入不是字典格式好比列表,設置參數safe=False;JsonResponse的默認Content-Type爲application/json,不須要咱們寫了。

狀態保持

概述

clipboard.png

啓用session

# settings.py  默認已經啓用
'django.contrib.sessions',
'django.contrib.sessions.middleware.SessionMiddleware'

使用session

啓用session後,每一個HttpRequest對象都將具備一個session屬性,它是一個相似字典的對象

方法 解釋
get(key, default=None) 根據鍵獲取會話的值
clear() 清除全部會話
flush() 刪除當前的會話並刪除會話的cookie
del request.session[鍵] 刪除會話

示例

def home(request):
    userAccount = request.session.get("userAccount", default="未登陸")
    return render(request, "home.html", {"userAccount":userAccount})
def cart(request):
    userAccount = request.session.get("userAccount", default="未登陸")
    return render(request, "cart.html", {"userAccount":userAccount})
def login(request):
    if request.method == "GET":
        fromPath = request.GET.get("from")
        return render(request, "login.html", {"fromPath":fromPath})
    else:
        userAccount = request.POST.get("userAccount")
        passwd      = request.POST.get("passwd")
        # 從哪裏來
        fromPath = request.GET.get("from")
        # 驗證
        if userAccount == "sunck" and passwd == "sunck1999":
            #登錄成功
            #狀態保持,將用戶名寫入session
            request.session["userAccount"] = userAccount
            
            fromPath = "/" + fromPath + "/"
            return redirect(fromPath)
        else:
            #登錄失敗
            return redirect("/login/?from=%s"%fromPath)
from django.contrib.auth import logout
def quit(request):
    logout(request)
    return redirect("/home/")

過時時間

clipboard.png

存儲session

基於數據庫的會話: 默認的會話存儲方式

SESSION_ENGINE='django.contrib.sessions.backends.db'

基於緩存的會話: 只存在本地內存中,若是丟失則不能找回,比數據庫的方式讀寫更快

SESSION_ENGINE='django.contrib.sessions.backends.cache'

數據庫用於作持久化,緩存用於提升效率,先去緩存中取數據,緩存沒有再去數據庫中取,而後在緩存中存一份

SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

使用redis緩存session

SESSION_ENGINE='redis_sessions.session'
SESSION_REDIS_HOST='localhost'
SESSION_REDIS_PORT=6379
SESSION_REDIS_DB=0
SESSION_REDIS_PASSWORD=''
SESSION_REDIS_PREFIX='session'

#經過redis-cli客戶端能夠查看:
127.0.0.1:6379> select 0
OK
127.0.0.1:6379[4]> keys *
1) "session:0bjyuegx0i5ivyuzpb8ezgo0b35u2z4v"
相關文章
相關標籤/搜索