67、django之模型層(model)--查詢補充及mookie
本篇導航:
- F查詢與Q查詢
- cookie
一、F查詢與Q查詢
1、以Book表為例
class Book(models.Model) : title = models.CharField(max_length=32) publish = models.DateField() price = models.DecimalField(max_digits=5,decimal_places=2) commnetNum = models.IntegerField() keepNum = models.IntegerField()
2、F 查詢
在之前所有的例子中,我們查詢條件都只是將字段值與某個常量做比較。如果我們要對兩個字段的值做比較,用以前的語法是無法實現的會飄紅想要實現字段與字段相比較就只有用一個新的語法 F 查詢(使用前需要使用import導入F)
1)字段比較
# 查詢評論數大於收藏數的書籍 from django.db.models import F Book.objects.filter(commnetNum__lt=F(‘keepNum‘))
2)Django 支持 F() 對象之間以及 F() 對象和常數之間的加減乘除和取模的操作。
# 查詢評論數大於收藏數2倍的書籍 Book.objects.filter(commnetNum__lt=F(‘keepNum‘)*2)
3)修改操作也可以使用F函數
#將每一本書的價格提高30元 Book.objects.all().update(price=F("price")+30)
3、Q 查詢
如果有多條查詢條件我們想要實現 ‘與’ 的效果只需要用逗號將每個條件隔開就好,那麽怎麽實現 ‘或’ ‘非’ 呢 這就用到Q語句了(使用前需要使用import導入Q)
Q 對象可以使用& 和| 操作符組合起來。同時,Q 對象可以使用~ 操作符取反,這允許組合正常的查詢和取反(NOT) 查詢
#書名是西遊或水滸 | Book.objects.filter(Q(title="西遊")|Q(title="水滸")) #作者是布吉島或者不是2017年出版的書籍 & ~ #這個例子涉及多表關聯可以用上篇隨筆中的表結構 bookList=Book.objects.filter(Q(authorlish__name="布吉島") & ~Q(publishDate__year=2017)).values_list("title")
二、cookie
1、cookie簡述
1)cookie不屬於http協議範圍,由於http協議無法保持狀態,但實際情況,我們卻又需要“保持狀態”,因此cookie就是在這樣一個場景下誕生。
2)cookie的工作原理是:由服務器產生內容,瀏覽器收到請求後保存在本地;當瀏覽器再次訪問時,瀏覽器會自動帶上cookie,這樣服務器就能通過cookie的內容來判斷這個是“誰”了。
3)cookie雖然在一定程度上解決了“保持狀態”的需求,但是由於cookie本身最大支持4096字節,以及cookie本身保存在客戶端,可能被攔截或竊取,因此就需要有一種新的東西,它能支持更多的字節,並且他保存在服務器,有較高的安全性。這就是session。(下篇隨筆介紹session)
4)我們可以給每個客戶端的cookie分配一個唯一的id,這樣用戶在訪問時,通過cookie,服務器就知道來的人是“誰”。然後我們再根據不同的cookie的id,在服務器上保存一段時間的私密資料,如“賬號密碼”等等。
cookie彌補了http無狀態的不足,讓服務器知道來的人是“誰”;但是cookie以文本的形式保存在本地,自身安全性較差;所以我們就通過cookie識別不同的用戶,對應的在session裏保存私密的信息以及超過4096字節的文本。
2、簡單實現登錄效果
1)cookie的獲取
request.COOKIES[‘key‘] 或 request.COOKIES.get(‘key‘)
2)cookie的設置
rep = HttpResponse(...) 或 rep = render(request, ...) 或 rep = redirect()
rep.set_cookie()
3)參數
‘‘‘ def set_cookie(self, key, 鍵 value=‘‘, 值 max_age=None, 超長時間 expires=None, 超長時間 path=‘/‘, Cookie生效的路徑, 瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣可以避免將 cookie傳給站點中的其他的應用。 / 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問 domain=None, Cookie生效的域名 你可用這個參數來構造一個跨站cookie。 如, domain=".example.com" 所構造的cookie對下面這些站點都是可讀的: www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。 如果該參數設置為 None ,cookie只能由設置它的站點讀取。 secure=False, 如果設置為 True ,瀏覽器將通過HTTPS來回傳cookie。 httponly=False 只能http協議傳輸,無法被JavaScript獲取 (不是絕對,底層抓包可以獲取到也可以被覆蓋) ): pass ‘‘‘View Code
4)實例
主頁和登錄頁面 cookie可以保存20秒
def login(requset): if requset.method=="POST": username=requset.POST.get("user") password=requset.POST.get("pwd") ret=models.UserInfo.objects.filter(username=username,password=password) if ret: obj=redirect("/home/") obj.set_cookie("is_login",True,20) obj.set_cookie("username",username) return obj else: return redirect("/login/") return render(requset,"login.html") def index(request): is_login=request.COOKIES.get("is_login",None) if is_login: username=request.COOKIES.get("username") return render(request, "index.html",locals()) else: return redirect("/login/")View Code
3、刪除cookie
response.delete_cookie()
4、cookie存儲到客戶端
優點:數據存在在客戶端,減輕服務器端的壓力,提高網站的性能。
缺點:安全性不高:在客戶端機很容易被查看或破解用戶會話信息
67、django之模型層(model)--查詢補充及mookie