做用:視圖接收WEB請求並返回WEB響應方法:1. FBV(function base views) 就是在視圖裏使用函數處理請求。html
2. CBV(class base views) 就是在視圖裏使用類處理請求。 python
響應: 能夠是一個HTML頁面,一個重定向,一個404錯誤、一個JSON數據等等程序員
過程:ajax
概述: 服務器接收到http協議的請求後,會根據報文建立HttpRequest對象; 視圖函數的一個形參就是HttpRequest對象
is_ajax(): 若是請求是經過XMLHTTPRequest類發起的,返回Trueredis
QueryDict對象
clipboard.png數據庫
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)
使用表單提交,須要將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("註冊成功")
概述: HttpRequest對象由Django自動建立的,可是HttpResponse對象由程序員建立的;存儲服務器響應給客戶端的數據
常見的MIME類型(通用型):
屬性 | 描述 |
---|---|
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是保存在客戶端的信息,以鍵值對的形式保存
參數:
示例:
def setcookie(request): response = HttpResponse("sunck is a handsome man") response.set_cookie("sunck", "good") return response request.COOKIES.get("sunck")
功能: 重定向,服務器端跳轉
實現
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")
返回JSON數據,通常用於異步請求
優勢: 幫助用戶建立JSON編碼響應; 參數是字典對象,若是傳入不是字典格式好比列表,設置參數safe=False;JsonResponse的默認Content-Type爲application/json,不須要咱們寫了。
# settings.py 默認已經啓用 'django.contrib.sessions', 'django.contrib.sessions.middleware.SessionMiddleware'
啓用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/")
基於數據庫的會話: 默認的會話存儲方式
SESSION_ENGINE='django.contrib.sessions.backends.db'
基於緩存的會話: 只存在本地內存中,若是丟失則不能找回,比數據庫的方式讀寫更快
SESSION_ENGINE='django.contrib.sessions.backends.cache'
數據庫用於作持久化,緩存用於提升效率,先去緩存中取數據,緩存沒有再去數據庫中取,而後在緩存中存一份
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
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"