目录
6.HttpResponse对象或者jsonResponse
查询集QuerySet
查询集,也称查询结果集,QuerySet,表示从数据库中获取的对象集合。
当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表)
all():返回所有数据
filter():返回满足条件的数据
exclude():返回满足条件之外的数据
order_by():对结果进行排序
对查询集可以再次调用过滤器进行过滤,如
books = BookInfo.objecys.filter(readcount__gt=30).order_by('pub_date')
books
<QuerySet [<BookInfo:天龙八部>,<BookInfo:雪山飞狐>]>
也就意味着查询集可以含有零个,一个或者多个过滤器。过滤器基于所给的参数限制查询的结果
从SQL的角度讲,查询集与select语句等价,过滤器where,limit,order by子句
判断某一个查询集中是否有数据:
exists():判断查询集中是否有数据,如果有则返回True,没有则返回False
两大特性
1.惰性执行
创建查询集不会访问数据库,查到调用数据时,才会访问数据库,调用数据的情况包括迭代,序列化,与if何用
例如,当执行如下语句时,并没进行数据库查询,只是创建一个查询集books
books = BookInfo.objects.all()
继续执行遍历迭代后,才真正的进行了数据库的查询
for book in books:
print(book.name)
2.缓存
使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数
使用变量即缓存
限制查询结果集
可以对查询集进行取下标或切片操作,等同于sql中的limit和offest子句
注意:不支持负数索引
对查询集进行切片后返回一个新的查询集,不会立即执行查询。
如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发indexError异常,[0:1].get()如果没有数据引发DoesNotExist异常。
BookInfo.objects.all()[0:2]
分页
django/core/paginator.py
from django.core.paginator import Paginator
objects = ['john', 'paul', 'george', 'ringo']
p = Paginator(objects, 2)
p.count
p.num_pages
type(p.page_range)
p.page_range
page1 = p.page(1)
page1
page1.object_list
['john', 'paul']
page2 = p.page(2)
page2.object_list
['george', 'ringo']
page2.has_next()
False
视图
1.视图介绍和项目准备
2.URLconf
路由配置,在工程配置path,在子应用创建urls文件。
urlpatterns = [
path(r'home/', index, name = 'index'), # name是别名
]
通过视图名字
path = reverse('name')
# 如果设置了namespace
path = reverse('book:index')
redirect(path)
防止子应用里的name冲突,在项目的urls里加namespace
urlpatterns = [
path(r'', include('book.urls', namespace='book')),
]
3.路由命名于reverse反解析
# 如果设置了namespace
path = reverse('book:index')
4.使用PostMan对请求进行测试
goolge插件工具:PostMan
5.HttpRequest对象
提取URL的特定部分,如weather/beijing/2018,可以在服务器端的路由中用正则表达式截取;
查询字符串(query string), 形如key1=value1&key2=value2;
请求体(body)中发送的数据,比如表单数据,json,xml;
在http报文的头(header)中
6.HttpResponse对象或者jsonResponse
第一个参数传递字符串 不要传递对象,字典等数据
第二个status状态码
第三个content_type语法形式是:大类/小类 MIME
7.状态保持
浏览器请求服务器是无状态的
无状态:指一次用户请求时,浏览器,服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求
无状态原因:浏览器与服务器时使用Socket套接字进行通信的,服务器将请求结果返回给浏览器之后,
会关闭当前的Socket连接,而且服务器也会在处理页面完毕之后销毁页面对象。
有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
实现状态保持主要有两种方式:
在客户端存储信息使用cookie
流程
第一次请求过程
我们的浏览器第一次请求服务器的时候,不会携带任何cookie信息
服务器接收到请求之后,发现 请求中没有任何cookie信息
服务器设置一个cookie。这个cookie设置在响应中
我们的浏览器接收到响应之后,发现响应中有cookie信息,浏览器会将cookie信息保存起来
第二次及其之后的过程
当我们的浏览器第二次及其之后的请求都会携带cookie信息
我们的服务器接收到请求之后,会发现请求中携带的cookie信息,这样的话就人事是谁的请求了
看效果
从http协议角度深入掌握cookie的流程(原理)
在服务器端存储信息使用session
session依赖于cookie
8.类视图与中间件
settings.py里的MIDDLEWARE就是中间件注册列表
django中得中间件是一个轻量级,底层得插件系统,可以介入Django得请求和响应处理过程,
修改Django得输入或输出。中间件得设计为开发者提供了一种无侵入式得开发方式,增强了Django框架得健壮性。
我们可以使用中间件,在Django处理视图得不同阶段对输入或输出进行干预
1.中间件得定义方法
定义一个中间件工厂函数,然后返回一个可以被调用得中间件。
中间件工厂函数需要接收一个可以调用得get_response对象
返回得中间件也是一个可以被调用得对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。
2.注册中间件
settings.py里的MIDDLEWARE就是中间件注册列表
3.中间件执行顺序
请求前的执行顺序,是按照注册的顺序
响应后的执行顺序,是按照注册的反顺序
9.模板
自带模板
基本使用
创建templates文件夹,
创建html模板,
在settings配置模板路径TEMPLATES-》DIRS os.path.join(BASE_DIR,'templates'),
在views.py写 视图类
在urls.py 写路由
流程控制
语法 运算符左右两侧必须有空格
{% for item in firends %}
<li>{ {item}}<li>
{% endfor %}
过滤器
过滤器的本质是函数,
语法如下:
使用管道符号|来应用过滤器,用于进行计算,转换操作,可以使用在变量,标签中
如果过滤器需要参数,则使用冒号:传递参数。
变量|过滤器:参数
列举几个如下:
safe:禁用转义,告诉模板这个变量是安全的,可以解释执行
length:长度,返回字符串包含字符的个数,或列表,元组,字典的元素个数
default,默认值,如果变量不存在时则返回默认值
data|default:'默认值'
date 日期,用于对日期类型的值进行字符串格式化,常用的格式化字符串如下:
Y表示年,格式为4位,y表示两位的年
m表示月,格式为01,02,12等
d表示日,格式为01,02等
j表示日,格式为1,2等
H表示时,24进制,h,12进制
i表示分,为0-59
s表示秒,为0-59
eg:{ { value|date:'Y年 m月 d日'}}
继承
模板继承
和类继承含义是一样的,主要是为了提高代码重用,减轻开发人员的工作量
父模板
如果发现在多个模板中某些内容相同,那就应该把这段内容定义到父模板中。
标签block:用于在夫模板中预留区域,留给子模版填充差异性的内容,名字不能相同。为了更好的可读性,建议给endblock标签写上名字,这个名字与对应的block名字相同,父模板中也可以使用上下文中传递过来的数据。
{% block 名称 %}
预留区域,可以编写默认内容,也可以没有默认内容
{% endblock 名称 %}
继承使用extends
jinja2模板
jinja2是python下一个被广泛应用的模板引擎,是由python实现的模板语言,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能,尤其是Flask框架内置的模板语言
由于django默认模板引擎功能不齐全,速度慢,所以我们也可以再Django中使用jinja2,jinjia2宣称比django默认模板引擎块10-20倍。
Django主流的第三方APP基本上也都同时支持Django默认模板及jinja2,所以要用jinja2也不会由多少障碍。
安装jinja2模块
pip insatall jinja2
配置
Django配置jinja2
1.在项目文件中创建jinja2_env.py文件
2.在settings.py TEMPLATES 的‘BACKEND'改为django.template.backends.jinja2.jinja2'
在TEMPLATES下'OPTIONS'下添加’environment‘:'book.jinja2_env.environmnet'
3.在settings里的Languages & Frameworks 里改Template lanuage:Jinja2
CSRF
cross site request forgery 跨站请求伪造
csrf 指攻击者盗用了你的身份,以你的名义发送恶意请求。
包括:以你的名义发送邮件 发消息
原理
cookie
如何防范
同源策略
短信验证