一、模版语言中的母板和继承
1、应用场景:这一周写的学员管理系统都是各自独立的页面渲染,实际情况显然不是这样的,所以有以下问题需要解决:
(1)如何实现将所有页面的公共部分保存起来,我们点击菜单中的不同选项跳转到不同页面,但公共的部分首宗没有变
要想解决这个问题,就要用到母板和继承了
2、在母板中进行占位
{% block 名字 %} 这个名字就代表占位的符号
{% endblock %}
{% block xxx-css %} 通常写入这样的形式来表示子页面中需要额外引入的CSS文件
{% endblock %}
{% block xxx-js %} 通常写入这样的形式来表示子页面中需要额外引入的JS文件
{% endblock %}
3、子页面中如何继承
(1)在页面的最上方写入:{% extends "母板文件名" %} 这就是继承母板中所有的内容
(2) 子页面中如何添加和母板不同的部分:利用母板中的block占位去写自己区别于母板的部分,包括引入自己的CSS和JS文件
{% block 母板中的名字 %}
实际的内容
{% endblock %}
4、引用
{% include "文件名" %} 这就是引用了指定文件名的内容,比如说有好几个页面都是相同的导航条,其它部分全都不一样,这时候用继承就没有必要了,直接引用就可以了
二、cookie
1、定义:
》》》是保存在浏览器端的一个个键值对
》》》服务端可以通过响应向浏览器写cookie数据(响应头会有set-cookie字段)
》》》浏览器每次发请求时会携带cookie数据
2、应用场景:
(1)这周我们写的学员管理系统每次URL请求时都对应不同的函数,但是实际中这些操作应该是要登录以后才能做,并且不登陆输入对应的URL也不能执行对应的函数
(2)每次执行对应的操作的时候也要首先判断登录状态
上面两个问题都可以用cookie来解决
3、如何实现
(1)创建cookie:因为是服务端给客户端写cookie,所以是响应携带的数据,这里的response就指代服务端给客户端的响应,Django给响应提供了创建cookie的方法
》》》不带盐的cookie
response.set_cookie()
参数:
key, 设置键,按位置传,字符串形式
value='', 设置key对应的值,默认是空字符串
max_age=None, 超时时间,代表经过多少秒后cookie的key值就会失效,注意这里并不是指多少秒没有操作就会失效而是多少秒后就会失效
expires=None, 也是超时时间,但是是指定时间,比如说指定几月几号的几时几分几秒sookie失效
path='/', 指的是URL,/代表根
不要求掌握::
domain=None, 域名
secure=False, 安全相关,加密用的
httponly=False JS代码不能读取cookie,只能浏览器发请求时携带cookie
》》》带盐的cookie
response.set_signed_cookie()
参数:
key,
value,
salt="自己设置的盐"
**kwargs
》》》》注意注意注意:::::
value值默认是字符串形式,所以我们在判断时必须要加引号
value值也可以是字典或列表等类型,但是存储的仍然是字符串类型,若想要存储字典等类型并且获取value值也可以得到字典等类型,就必须用json序列化和反序列化
不能设置多个key
(2)取出cookie:cookie可以创建多个key和value
》》》不带盐的cookie
request.COOKIES 拿到所有的cookie数据
request.COOKIES.get(key) 这样就可以取到我们设置的value值,注意一点不带盐的cookie值若没有的话默认为空字符串(None)
》》》带盐的cookie
request.get_signed_cookie(key,salt=自己设置的盐,default=xxxx) 这样就可以取到我们自己设置的带盐的value值
注意一点,带盐的cookievalue没有默认值,所以我们在取的时候必须设置一个默认值,否则的话是会报错的
(3)删除cookie值
response.delete_cookie(key)删除指定的key值
补充:另一种需求:我们写的管理系统必须要登陆成功以后才能进行额外的操作,那比如用户在输入网址时提示他要登陆,登录成功后按照我们的写法就直接跳到首页了,那其实应该跳到用户之前输入的网址上,这里就要用到request的一个方法
request.get_full_path() 这里就拿到了用户输入的网址,即请求中的URL,我们可以在登录时使用get请求把用户之前输入的网址和nexturl这个字段拼接到URL中,这样我们后端利用nexturl这个字段取数据后就可以直接跳转到用户输入的网址了
》》》》》注意:::这个方法在后端和前端都可以用,在前端当作占位符使用{{request.get_full_path}},也是拿到请求中的URL
补充:装饰器修复
from functools import wraps
在装饰器内部协商@wraps(func)就可以保留原函数的一些自身属性和注释,因为一执行装饰器,原函数名
from functools import wraps def wrapper(func): @wraps(func) # 修复一下被装饰函数的信息 def inner(*args, **kwargs): print("叫地主") func() return inner @wrapper def f1(): """ 来自星星的你 :return: """ return "f1" ret = f1.__doc__ print(ret)
实际上就变成了inner