python全栈第二十九天 Django

目录

 

查询集QuerySet

两大特性

1.惰性执行

2.缓存

限制查询结果集

分页

视图

1.视图介绍和项目准备

2.URLconf

3.路由命名于reverse反解析

4.使用PostMan对请求进行测试

5.HttpRequest对象

6.HttpResponse对象或者jsonResponse

7.状态保持

8.类视图与中间件

9.模板

自带模板

jinja2模板

CSRF


查询集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

如何防范

同源策略

短信验证

猜你喜欢

转载自blog.csdn.net/qq_41179365/article/details/111947320