重学正则
静态执行命令
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就不会进行处理了
'''