day91 orm查询以及xss安全攻击

重学正则

静态执行命令

pycharm创的表,用native删了,pycharm就不会再创建了,除非再用native去建

ORM(后续)

数据准备:

# models.py
class UserType(models.Model):
    title = models.CharField(max_length=32, null=True)


class Users(models.Model):
    name = models.CharField(max_length=32, null=True)
    age = models.CharField(max_length=32, null=True)
    ut = models.ForeignKey('UserType', null=True, related_name='users')
# related_name:相当于起别名,在反向查询时使用

# views.py
from app01 import models

def test(request):
    res = models.UserType.objects.all()
    for obj in res:
        # 普通的反向查询
        # print(obj.users_set.values('name'))
        # 加了releate_name后的
        print(obj.user_info.values('name'))
    return HttpResponse('ok')
# 注意:加了之后,就不能使用之前的小写表名_set的方式了

数据操作

# views.py
# 添加多条数据
def test(request):
    info = [
        models.Users(name='a', age='20', ut_id=1),
        models.Users(name='b', age='255', ut_id=2),
        models.Users(name='c', age='10', ut_id=3),
        models.Users(name='d', age='19', ut_id=1),
        models.Users(name='e', age='17', ut_id=2),
    ]
    res = models.Users.objects.bulk_create(info)
    print(res)  # [<Users: Users object>, <Users: Users object>, <Users: Users object>, <Users: Users object>, <Users: Users object>]
    return HttpResponse('ok')

orm查询大全

# views.py
# query:查看代码对应的sql原生语句,目前发现只有查询可以用
def test(request):
    # 1, 字段名过滤
    res = models.Users.objects.filter(name='leijun') # where name = 'leijun'
    res = models.Users.objects.filter(id__gt=3) # id大于3
    res = models.Users.objects.filter(id__gte=3) # id大于等于3
    res = models.Users.objects.filter(id__lt=3) # 小于3
    res = models.Users.objects.filter(id__lte=3) # 小于等于3
    res = models.Users.objects.exclude(id=3) # 不等于3
    res = models.Users.objects.filter(id=2, name='leijun') # where id = 2 and name = 'leijun';
    
    # 2. in   not in 
    res = models.Users.objects.filter(id__in=[2, 4, 5]) # in
    res = models.Users.objects.exclude(id__in=[2, 4, 5]) # not in
    
    # 3. between...and   两头都能取,闭区间
    res = models.Users.objects.filter(id__range=[3, 5])
    
    # 4. like 模糊查询
    # g: global(全局)   i: ignore(忽略大小写)
    res = models.Users.objects.filter(name__startswith='le')    # 匹配开头
    res = models.Users.objects.filter(name__istartswith='Le')   # 忽略大小写
    
    res = models.Users.objects.filter(name__endswith="d")   # 匹配结尾
    res = models.Users.objects.filter(name__iendswith="D")  # 忽略大小写
    
    res = models.Users.objects.filter(name__regex="^zekai$")    # 正则表达式
    
    # 5. count  # 暂不清楚是以什么字段查询的,应该是id
    res = models.Users.objects.filter(id__gt=3).count()
    
    # 6. order by 
    # 默认为升序(asc) 在前面加'-'为降序(desc)
    res = models.Users.objects.all().order_by('-id','age')  # 先按id降序,再按age升序
    
    # 7. group by
    from django.db.models import Count, Min, Max, Sum
    res = models.UserInfo.objects.values("name").annotate(s=Sum('age')) # 这里的s相当于取别名,后面用sum('age')的时候需要用s,不写就是age__sum
    #返回的是一个列表套字典
    
    # 8. having:这里筛选要注意类型,如果是字符串,那么比较的规则会较为复杂,参考之前的数据库博客
    # filter写前面是where,写后面就是having
        res = models.Users.objects.values("name").annotate(s=Sum('age')).filter(s__gte=30)
    print(res, res.query)
    
    # 9. limit: 和原生sql不同,不是一个起始位置一个个数,这里是使用切片的方式,顾头不顾尾
    res = models.Users.objects.all()[1:4]   # 查询索引1-3的,注意是索引
    
    # 10. or
    # 要使用Q
    from django.db.models import Q
    res = models.Users.objects.filter(Q(id__gt=3) | Q(name='leijun')) # where id > 3 or name = 'leijun'
    # or and 联用
    res = models.Users.objects.filter(Q(Q(id__gt=3) | Q(name='leijun')) & Q(age__lt=23))  # where (id > 3 or name = 'leijun') and 'age' < 23;
    
    # 11. only | defer
    # only:只取出这几列
    # defer:不取出这几列
    res = models.Users.objects.only('name')
    print(res, res.query)
    for i in res:
        print(i.__dict__)
        print(i.age)
        
    res = models.Users.objects.defer('id', 'age', 'name')
    print(res, res.query)
    for i in res:
        print(i.__dict__)
        print(i.age)
    # 这两个东西很怪,首先他们都会取出id,only不填id也会取出id,defer填了id也照样取id,
    # 这两个返回的都是QuerySet套对象,对象的__dict__结构是这样的
    # only:{'_state': <django.db.models.base.ModelState object at 0x000002F139EB7CF8>, 'id': 1, 'name': 'haha'}
    # defer:{'_state': <django.db.models.base.ModelState object at 0x000002F139EB7860>, 'id': 5, 'ut_id': 1}
    # 但是问题是,他们都可以点出age来,所以少用这两个东西
    
    # 12. F:将原来的值循环拿到,然后操作
    from django.db.models import F
    models.Users.objects.update(age=F('age') + 1)   # age = 之前的age + 1
    
    # 13.原生sql 类似pymysql
    from django.db import connection, connections
    cursor = connection.cursor()  
    # cursor = connections['default'].cursor()  # 这个可以修改数据库,里面的default就是在settings中设置的数据库名
    cursor.execute("""SELECT * from app01_users where id = %s""", [1])
    row = cursor.fetchone()
    print(row)
    
    # 14.distinct
    # distinct里面不用填参数,按照values里进行去重,values里面有多个值,则是多个值同时重复才会取出
    # 填参数会报错NotImplementedError: DISTINCT ON fields is not supported by this database backend
    res = models.Users.objects.values('age', 'name').distinct()
    print(res, res.query)
    
    # 返回的大都是一个queryset列表包着被查到的对象,除了中间使用了values的
    return HttpResponse('ok')

安全攻击

xss

  • 跨站脚本攻击(通过js代码)

原因:

  • 服务器过于相信客户端提交过来的信息,并没有进行限制
# 举例:
'''
    用户在提交数据时,提交js代码,例如<script>alert('111')</script>
    而服务器没有进行处理,直接进行解析,那么就会弹窗
    用户也可以通过js代码,获取cookie,之类的信息,造成损失
'''
# 解决方案
'''
    django自动帮我们解决了这个问题,会接收,但不会解析,而是转义成纯文本
    例如博客园的评论功能就是这样的
'''
# 非要接收
'''
    如果不需要django自动处理接收的信息,则可以在html接收数据时,后面加上 | safe
    例如:
        {{ info | safe}}
        这样django就不会进行处理了
'''

转载于:https://www.cnblogs.com/lucky75/p/11355410.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值