“比试继续吧。”长眉长老挥挥手,但他眼中已经流露出若有所思的神色。

67、django之模型层(model)--查询补充及mookie


 已经连续写了好几篇django的模型层(model)增删改查的随笔了,没篇大篇幅都是查询相关的操作,可以看出查询在数据的操作中是多么的重要,而本篇最后再补充一点关于关于查询的一些方法,模型层基本的操作也就结束了。然后会有一部分cookie的知识点,你可以为上篇随笔的图书管理小练习加上简单的登录。一个当然所有的讲解都是django一些浅显的知识,希望可以对读者有所帮助。

 

本篇导航:

  • 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存储到客户端
优点:数据存在在客户端,减轻服务器端的压力,提高网站的性能。
缺点:安全性不高:在客户端机很容易被查看或破解用户会话信息

 

当前文章:http://hnhdqp.com/html_78483.html

发布时间:2018-11-20 04:17:36

阳泉兼职工作招聘 北京夜班兼职招聘信息 手工活兼职 手机接单的兼职工作 正规的京东客服兼职 月入过万偏门项目 2018年投资好项目 在家兼职日赚100-200 小本创业风投项目 家庭式小作坊项目

编辑:宗宗侯宗

相关新闻

起亚K3这车买了一月了,心里憋了很多话,好坏统统说出来

2018-11-20 05:45:53

陵水壬杉俚文化传媒有限公司

黄金持续上涨 大行缘何仍看空

2018-11-20 01:24:33

山西官墓网络技术有限公司

市总工会慰问一线工人

2018-11-20 02:15:12

德阳姑较科技股份有限公司

《万万没想到》预告片 点映创纪录成现象级喜剧

2018-11-20 05:39:05

郑州土倚滥工艺品有限责任公司

热门推荐

  • 日本各地集会抗议森友文件篡改问题:高呼安倍下台
  • AMD为玩家成立ReSX项目组,专门优化《绝地求生》等游戏
  • 在ASP.NET MVC中使用Web API和EntityFramework构建应用程序
  • vivo全面屏新机谍照泄露:无刘海窄下巴
  • 专访大疆总裁罗镇华:无人机上市背后的玄机
  • 前端构建工具之争——Webpack vs Gulp 谁会被拍死在沙滩上
  • 苏州大学2018年工商管理硕士专业学位(MBA)研究生招生简章
  • 巴基斯坦法院签发针对前总理谢里夫的逮捕证
  • 三家厂商首发Ryzen APU笔记本:为AMD保驾护航
  • 茂县失联名单中15人确定宁静 4具遗体身份确认
  • 河北新闻网版权所有 本站点信息未经允许不得复制或镜像 法律顾问:手机上如何赚钱 做快手怎么赚钱
  • 天津河北区兼职 copyright ? 2000 - 2016
  • 新闻热线:0311-67563366 广告热线:0311-67562966 新闻投诉:0311-67562994
  • 冀ICP备 09047539号-1 | 互联网新闻信息服务许可证编号:1312006002
  • 广播电视节目制作经营许可证(冀)字第101号|信息网络传播视听节目许可证0311618号
  • 有没有靠谱的手机兼职 苹果手机赚钱应用 头条号个人号怎么赚钱 苹果手机赚钱软件排行