12月4日学习内容整理:管理系统中的分页,Session
补充:
1、django没有socket服务期程序,它是采用第三方来实现的,而wsgi协议就是规定了wed服务和应用之间应该怎样配合,所以django必须依赖wsgi才能运作
2、django中的app文件夹:我们可以把针对不同业务逻辑处理的函数写到不同的app文件夹里,分开处理
里面的views.py文件我们可以写对应的函数
里面的models.py文件可以写自己的数据库操作
一、分页操作
我们可以把分页写成一个独立的文件,每次要用的时候直接拿过来就可以了
补充两个知识点::::
1、绝大多数的网站涉及到页面渲染时都会过滤掉关键字等安全操作(实际上就是全部识别为字符串),否则某个用户评论中带有前端语言当加载页面时就会出问题,如果我们在写模版文件时需要前端识别我们所写的标签,就利用模版语言中safe去掉这种过滤操作
{{ 变量名|safe }} 这样就会以html形式渲染,否则默认是以字符串格式渲染
2、request.path_info 输出请求的URL链接,但是没有get请求的数据,就是只是单纯的url,没有?后面的数据
二、session
1、定义:是保存在服务端的一个个键值对,同时要依赖cookie
2、作用:是为了网络传输中最大可能保障数据的安全,跟带盐的cookie作用是类似的,但是session的安全性更高
3、原理:这里以用户登录验证为例
用户在浏览器输入用户名和密码,发给后端从数据库中提取信息进行验证,验证成功后django会自动生成一个随机字符串(就代表当前用户),将这个随机字符串发给前端,保存在前端的cookie中,前端在发请求时也会发送这个cookie,服务端根据这个随机字符串作为key,我们写入一些当前用户经常用到的数据作为value组成字典,django会把这个字典默认存储在数据库的表中,当用户做其他操作前端发出相应的请求时就会带上cookie中的这个代表当前用户的随机字符串,后端取到这个随机字符串就可以进行判断登录状态,若数据库中存在这个随机字符串就代表当前用户已登录,否则就让用户先登录,已登录时我们就可以取出存在这个随机字符串下的value值也就是代表当前用户的一些基本信息,这样我们就可以进行其它的操作了
注意:
》》》django会默认将session存储在数据库中,创建数据库的命名是在django项目的cmd目录下:
python manage.py makemigrations
python manage.py migrate 创建出来的表中就有保存session的表
也可以保存在其它地方,文件、缓存、缓存+数据库或者是加密cookie
》》》服务端存储的session中key就是随机字符串,value是对应的数据,比如用户名,ID之类的常用的
4、使用
(1)创建session:生成随机字符串并发给前端保存在cookie这些django自己已经做了
request.session[key]=value
(2)取出session:用前端发过来的cookie中的随机字符串进行判断这些django也自己做了,如果对应的value值取不到就代表用户没登陆,这时候就可以在函数中返回跳转登录页面提示用户登录
request.session.get(key)
(3)删除session:django先获取当前用户的随机字符串,再从数据库中把相应的记录删掉
》》》整条删除:del request.session.delete()
》》》删除某一个值:del request.session.get(key)
5、session的配置信息:写在settings.py中
SESSION_ENGINE
=
'django.contrib.sessions.backends.db'
# 引擎(默认)
SESSION_COOKIE_NAME =
"sessionid"
# Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH =
"/"
# Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN
=
None
# Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE
=
False
# 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY
=
True
# 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE
=
1209600
# Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE
=
False
# 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST
=
False
# 是否每次请求都保存Session,默认修改之后才保存(默认)
最后一个参数的意思是:当为true时,每一次发送请求都会服务端都会保存session,而超时时间也会从最后一次刷新时开始计时;当为false时,经过设置的超时时间后session就会失效,无论这期间刷新过多少次都没有影响
6、session和cookie的区别
》》》session是保存在服务端的一个个键值对,而cookie是保存在浏览器的一个个键值对,保存的地方不一样
》》》session比cookie更安全,因为它只把随机字符串保存在浏览器,这个随机字符串无法解译出任何东西,但是带盐的cookie虽说是加密的,但是通过某些解密手段也可以获取到用户的相关信息
》》》session比cookie服务端的压力要大,因为所有登录用户的信息都要存储在服务端,所以占用服务端的存储空间是很大的。处理起来相对较慢
》》》cookie处理起来更快,因为是浏览器存储,浏览器发送,服务端只要取值判断就可以了
三、补充(老师博客中的)
1、存储在数据库中的使用方法补充
def index(request): # 获取、设置、删除Session中数据 request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在则不设置 del request.session['k1'] # 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 用户session的随机字符串 request.session.session_key # 将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否 request.session.exists("session_key") # 删除当前用户的所有Session数据 request.session.delete("session_key") request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。
2、存储在文件中的配置信息
#a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https传输cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
3、存储在缓存和数据库中的配置信息
#数据库用于做持久化,缓存用于提高效率 #a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
4、存储在加密的cookie中这个我们一般不用