一 中間件css
0 怎樣使用中間件
在setting配置文件裏面註冊你的中間件,以下:
'mymiddleware.MD1', 前面是文件名,後面是類名
而後在你的mymiddleware文件裏導入:
from django.utils.deprecation import MiddlewareMixinhtml
例子:setting配置jquery
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'mymiddleware.MD1', ]
mymiddleware.py文件配置:ajax
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse,render class MD1(MiddlewareMixin): def process_request(self, request): print("這是md1中的process_request方法") print(id(request)) request.s21 = "好"
1. 何時使用中間件?
1 當須要在全局改變Django框架的輸入輸出時
2. 中間件不宜添加過多,功能過於複雜
不然會增長請求的響應時間
3. Django中間件有哪些
1. 五個方法(三個經常使用)
主要記憶:執行時間、執行順序、參數和返回值數據庫
1. process_request(self,request)
1. 執行時間
在執行視圖函數以前執行
2. 執行順序
按照註冊的順序執行,從上到下依次執行
3. 參數和返回值
1. request參數和視圖函數中是同一個對象
2. 返回值:
1. 返回None:請求繼續日後執行,(執行了views函數)
2. 返回響應對象:請求就結束了,要返回響應了django
2. process_response(self, request, response)
1. 執行時間
視圖函數執行以後(拿到響應對象以後)
2. 執行順序
按照註冊的倒序執行
3. 參數和返回值
1. 參數:request請求對象
response:響應對象
2. 返回值:
只能返回響應對象
1. 返回默認的
2. 本身生成一個響應對象返回 session
3. process_view(self, request, view_func, view_args, view_kwargs)
1. 執行時間
視圖函數以前,在urls.py找到將要執行的視圖函數以後
2. 執行順序
註冊的順序執行
3. 參數和返回值
1. 參數:
1. request: 請求對象
2. view_func:將要執行的視圖函數
2. 返回值:
1. 返回None:繼續日後執行
2. 返回響應對象,直接跳出,下面的process_view就不執行了,按照process_response方法的順序執行
有條件觸發:
4. process_template_response(self,request,response)
1. 執行時間:
1. 視圖函數以後,而且返回的響應對象是要有render方法
2. 執行順序:
1. 按照註冊的倒序執行
3. 返回值:
1. 對傳遞過來的響應對象,調用其render方法,把返回值向後繼續傳遞app
5. process_exception(self, request, exception)
1. 執行時間:
1. 當視圖函數中拋出異常的時候才執行
2. 執行順序:
1. 註冊的倒序
3. 參數和返回值
exception:視圖函數中拋出的異常
返回響應對象,就跳出按照process_response方法的順序執行框架
二 orm多對多異步
1. ORM多對多字段
# 多對多,自動幫咱們在數據庫創建第三張關係表
books = models.ManyToManyField(to='Book', related_name="authors")
參數:
- to:表示和哪張表創建多對多的關係
- related_name:表示返向查詢時使用的那個字段名,默認反向查詢時使用表名_set的方式
2. 多對多字段的方法
1. 查詢
.all() --> 多對多查詢的方法,
2. 刪除
3. 添加新做者
1. 當form表單提交的數據是列表(多選的select\多選的checkbox)
取值:
request.POST.getlist("hobby")
例子:
class Addauthor(views.View): def get(self, request): book_list = models.Book.objects.all() return render(request, "add_author.html", {"book_list": book_list}) def post(self, request): # 獲取用戶的新名字 auth_name = request.POST.get("name") # 獲取用戶添加的書,由於多選全部用getlist books_ids = request.POST.getlist("books") print(auth_name, books_ids) # 建立用戶 author_obj = models.Author.objects.create(name=auth_name) # 去第三張關係表裏創建記錄 author_obj.books.set(books_ids) return redirect("/author_list/")
4 編輯:
2. .set([id1,id2,...]) 參數是一個列表 --> 刪除原來的設置新的,更新關聯對象
3. .add(id值) --> 在原來的基礎上增長新的紀錄
例子:
class Editauthor(views.View): def get(self, request, edit_id): author_name = models.Author.objects.filter(id=edit_id).first() book_obj = models.Book.objects.all() return render(request, "edit_author.html", {"author_name": author_name, "book_list": book_obj}) def post(self, request, edit_id): author_obj = models.Author.objects.filter(id=edit_id).first() new_name = request.POST.get("name") # 獲取選擇的書 new_book = request.POST.getlist("books") author_obj.name = new_name author_obj.save() # 保存關聯的書的id author_obj.books.set(new_book) return redirect("/author_list/")
多對多語句查詢:
import os if __name__=='__main__': if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "練習.settings") import django django.setup() from app01 import models # add方法和set方法 ''' author_obj=models.Author.objects.first() ret=author_obj.books.first().title print(ret) author_obj.books.set([2,502,503,501]) # 爲做者添加三本書 做者id在前,書名id在後 author_obj.books.add(504) # add在原來的基礎上增長 set刪除原來的而後在設置新的 ret=author_obj.books.all().values_list("title") print(ret) ''' #查詢操做 # 查詢第一個做者寫過書的名字 #1 基於對象的查詢正向查找 ret=models.Author.objects.first().books.all().values("title") print(ret) #基於對象的反向查找 # 默認按照表名_set.all() ret = models.Book.objects.last().authors.all().values("name") print(ret) #基於queryset的雙下滑線查詢 # ret = models.Author.objects.filter(id=2).values("books__title") #查詢id爲2做者寫的書 # print(ret) # 基於queryset的雙下滑線的反向查找,由書找做者(兩張寫法) res=models.Book.objects.filter(id=504).values_list("authors__name") res1=models.Book.objects.filter(id=504).values("authors__name") # print(res,res1)
三 ajax
參考 https://www.cnblogs.com/liwenzhou/p/8718861.html
1 ajax的特色:
優勢:
1. 偷偷發請求,用戶無感知
2. 局部刷新 相對於其餘請求方式而言,返回的數據量小
3. 同一個頁面能夠發送屢次請求 異步
缺點:
1. 若是濫用,對服務端的壓力比較大
ajax的使用:
jQuery版:
導入jQuery
$.ajax({ url: "往哪裏發請求", type: "發送請求的類型", data: { }, success:function(res){ } })
例子:註冊一個用戶名,並檢查用戶名是否註冊
views.py以下:
def reg(request): return render(request,".//ajax/reg.html/") def check_username(request): username=request.POST.get("name") print(username) exsit_name=models.Userinfo.objects.filter(name=username) print(exsit_name) # obj=models.Userinfo.objects.first() # print(obj) if exsit_name: res="用戶名已經存在" else: res="" return HttpResponse(res)
html以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>註冊</title> </head> <body> {% csrf_token %} <input type="text" id="i1"><span style="color: red"></span> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> <script> $("#i1").blur(function () { $.ajax({ url:"/check_username/", type:"post", data:{ "name":$("#i1").val(), "csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val() }, success:function (res) { console.log(res); $("#i1+span").text(res); } }) }) </script> </body> </html>
四 jquery部分知識
2. .text() 1. 獲取標籤的文本內容 $("div").text() --> 默認取全部div的文本內容 2. 有參數表示 設置標籤的文本內容 $("div").text(‘哈哈’) --> 設置全部div標籤的文本爲哈哈 3. .html() 1. 獲取標籤的html內容 $("div").html() --> 默認取第一個div的html內容 2. 有參數表示 設置標籤的html內容 $("div").html(‘哈哈’) --> 設置全部div標籤的html內容爲哈哈 4. val() 1. 獲取input標籤的值 $("input").val() --> 默認取第一個input的值 2. 有參數表示 設置input標籤的值 $("input").val(666) --> 設置全部input標籤的值爲666