推导分页器原理
分页:当我们要展示的数据特别多的时候,一页展示不完,这个时候我们需要把展示的数据分成多页展示。
分页需要的几个参数:
1、总数据有多少条
2、每页展示多少条数据
3、一共展示多少页
4、总页数=总数据量/每页展示多少条数据
5、当前第几页(前端传过去的)
推导,了解不用掌握代码:
后端:
前端:
分页类的使用
分页器封装代码链接:13-Django高级之-分页器 (yuque.com)
代码详情:https://www.cnblogs.com/Dominic-Ji/articles/12035722.html
当我们使用非django内置的第三方功能活着组件代码的时候,我们一般在Django中创建一个utils文件夹来保存,在该文件夹内对模块进行功能性划分
untils可以在每一个应用下创建,具体结合实际情况
我们到了后期封装代码的时候不再局限于函数,是朝面向对象去封装
我们自定义的分页器是基于bootstrap样式来的 所以你需要提前导入bootstrap
bootstrap 版本 v3
jQuery 版本 v3
后端:
cookie和session的介绍
HTTP协议的特性之一:无状态
背景信息:
1. 早期的时候一些网站都是静态网站,不需要登录,比如:新闻类、博客等
2. 随着技术的发展以及用户的要求,诞生了诸如支付宝、淘宝、京东等电商网站,这些网站就必须要求用户登录,如果不登录,上家怎么知道是谁买的东西? 登录的目的其实就是上架可以识别这个用户是谁
3. 诞生了保存用户状态的技术:cookie和session
登录功能为例:
cookie的原理:
以淘宝为例,当进入淘宝网页,第一次是需要登录的,如果登录成功,淘宝不保存用户信息,下次访问就需要重新登录,每一次访问页面都要登录,用户体验感就会很差
为了解决上述问题就利用到了cookie,比如第一次登录成功,django后端就让浏览器把用户名和密码保存在浏览器中,下次访问淘宝页面时候,浏览器会自动把之前保存的用户名和密码再次验证。
上述做法,数据会不够安全
解决不安全问题,是做优化,把原本存在浏览器上的数据存到后端,就称之为session,
session解决了cookie数据不安全问题
session的原理:
以登录为例:
第一次登录成功之后,把用户信息保存在后端,其中,django默认是把用户信息保存在数据表中。(django_session表中)
1、先生成一个随机字符串
2、把用户信息保存在django_session表中
3、django后端会把随机字符串告诉浏览器保存起来
4、以后用户每次访问页面的时候,浏览器每次把随机字符串提交过来,django后端拿到随机字符串,去django_session表中查询数据,如果查到了就说明以前登录成功了,如果查不到,就说明还没有成功。
select * from django_session where session_key = ”
# 如果都把用户信息保存在django_session表中,有没有其他问题?
最大的问题就是数据量一旦很大,查询就是致命的
解决这个问题:
需要用到token,token就是随机字符串——保存用户信息——字符串返回给前端——每次都把token提交过来——后端做验证。
加密和解密都是后端做的,前端只需要每次把这个串来回传递就行了
跟面试相关的:
1. 保存在浏览器上的数据都称之为是cookie
2. session是保存在服务端的
3. session的数据相对更加安全,cookie不够安全
4. session是基于cookie工作的? 对还是不对? 对
5. django让浏览器保存cookie,用户有权可以设置浏览器不保存
6. session离开cookie一定就不能工作了,对还是不对?
obj = HttpResponse
return obj
obj = render
return obj
obj = redirect
return obj
# 操作cookie的时候,就用到了这个obj对象
案例:
Django操作cookie
cookie保存用户数据
set_cookie('username', 'jerry', max_age=5)
参数:
key,键 value=‘’,值 max_age=None,超过时间cookie需要延续时间(以秒为单位),如果参数是None,这个cookie会延续到浏览器关上为止。 expire = None,超过时间(IE requires expires, so set it if hasn’t bepath=’/‘, Cookie生效的路径,/ 表示根路径en already.)
baidu.com————->一级域名————–>解析出来很多个二级域名
www.baidu.com www1.baidu.com www2.baidu.com ly.baidu.com
# 买一个服务器的,有了IP———-》127.0.0.1/index/——–>hello.com—–>域名解析
127.0.0.1 hello.com—–》DNS解析—–》127.0.0.1
secure=False, 浏览器将通过HTTPS来回传cookie
httponly=False 只能http协议传输(前端发起请求给后端),无法被JavaScript获取
获取cookie和设置cookie也可以通过js实现
清空cookie
obj.delete_cookie(‘username)
使用场景:退出登录(注销功能)
Django操作session
session的数据保存在 后端,保存在后端的载体其实有很多种,比如:把数据保存在数据库、文件、redis等。
Django的默认保存位置在数据库中,在django_session表中,这张表是默认生成的。
如何操作session:
(设置成功一个session值会有什么变化)
1、会生成一个随机字符串
2、会把用户设置的信息保存在django_session表中,数据也做了加密处理。
3、把数据封装到了request.session里去
4、Django后端把随机字符串保存到了浏览器中
5、随机字符串保存在浏览器中的key==sessionid
当设置多个session值时,session_key是不变的,变得是session_Data
当设置多个session值时,django_session表中只存在一条记录(一台电脑的一个浏览器)
上述的做法有什么好处
节省MySQL的空间
设置session:
设置session后在这里查看:
获取session:
清空session:
获取session后发生了哪些事情
1、浏览器先把session回传到Django的后端
2、Django后端获取到sessionid,然后去数据表中根据session_key查询
查到了说明登录过了
查不到,就返回None
3、查询出来的数据默认是加密的,Django后端又把数据解密之后封装到request.session中
在取session值的时候,就从request.session中取
设置过期时间
session的默认过期时间是14天,过期时间可以修改。
4、session的相关参数
所有键、值、键值对
request.session.keys()
request.session.values()
requset.session.items()
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略
Django中的session配置
1、数据库session
SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘ # 引擎(默认)
2. 缓存Session
SESSION_ENGINE = ‘django.contrib.sessions.backends.cache’ # 引擎
SESSION_CACHE_ALIAS = ‘default’ # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
3. 文件Session
SESSION_ENGINE = ‘django.contrib.sessions.backends.file‘ # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
4. 缓存+数据库
SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db‘ # 引擎
5. 加密Cookie Session
SESSION_ENGINE = ‘django.contrib.sessions.backends.signed_cookies‘ # 引擎
其他公用设置项(放入setting可以直接改):
SESSION_COOKIE_NAME = “sessionid” # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)(这个可以修改,将这句话放进setting文件中,改引号后面的即可)
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,默认修改之后才保存(默认)
CBV添加装饰器
先写出登录和装饰器
第一种方式:
第二种方式:
第三种方式:
中间件
中间件它的执行位置在web服务网关接口之后,在路由匹配之前执行的
django中自带七个中间件
每个中间件都有自己独立的功能,也支持我们自己定义中间件
只要跟全局相关都可以用中间件来实现
如何定义中间件
class SecurityMiddleware(MiddlewareMixin): def process_request(self, request): pass def process_response(self, request, response): pass class SessionMiddleware(MiddlewareMixin): def process_request(self, request): pass def process_response(self, request, response): psss class CsrfViewMiddleware(MiddlewareMixin): def process_request(self, request): pass def process_response(self, request, response): pass
中间件就是一个类,然后这个类都继承了 MiddlewareMixin
这个类中有几个方法:
下面这两个必须要求掌握
process_request
process_response
process_view
process_template
process_exception
”’这几个方法并不是都要全写,而是,需要几个你就写几个!”’
自定义中间键步骤
随便拿一个视图举例:
1、在项目名下或者任意的应用名下创建一个文件夹
2、在这个文件夹下面创建一个py文件
3、在该py文件中写一个自定义的类必须要继承 MiddlewareMixin
4、写完之后要去配置文件中注册中间件
自定义中间件
总结:会先走
钓鱼网站
本质:form表单
username
shenfenzheng
<input type=’text’ name=’正规的’>
冒牌的
<input type=’text’ >
<input type=’hidden’ name=’冒牌的’> #这个是隐藏看不到的,就会进入冒牌
如何避免:后端要做验证,提交过来的数据是不是我之前返回的表单
加一个随机串
form表单:
加了下面这句话后前端会出现一段随机串
ajax(第一和第二种方式):
第三种方式:
在static文件夹下创建一个js文件
使用django官方提供的js文件
function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie !== '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } var csrftoken = getCookie('csrftoken'); // 每一次都这么写太麻烦了,可以使用$.ajaxSetup()方法为ajax请求统一设置。 function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ beforeSend: function (xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } });
导入js
csrf跨站请求的相关装饰器
Django中有一个中间件对csrf跨站做了验证,我只要把csrf的这个中间件打开,意味着所有方法都要被验证
在所有视图函数中:
只有几个视图函数做验证,只有几个视图函数不做验证
csrf_protect:哪个视图函数加了这个装饰器,这个函数就会做验证
csrf_exempt:哪个视图函数加了这个装饰器,这个函数就不会验证
导入模块:
from django.views.decorators.csrf import csrf_exempt,csrf_protect
csrf_protect
csrf_exempt
CBV验证:
Auth模块使用
auth模块是django自带的用户认证模块:
Auth模块是Django自带的用户认证模块:
我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。
Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统–auth,它默认使用 auth_user 表来存储用户数据。
在执行数据库迁移命令的时候,会自动生成一个默认的表,其中有auth_开头的很多表
auth_user表的作用:djagno自带的后台管理系统所依赖的数据就在这张表中
默认情况下,auth_user表是空表,没有用户名和密码,因此我们需要自己创建用户数据
需要创建一个超级管理员账号才能登录
python38 manage.py createsuperuser
python38 manage.py createsuperuser:创建超级管理员
创建用户后就可以访问login页面
Auth模块相关方法
登录功能、注册功能、修改密码、退出系统、认证功能等
登录功能:
验证是否登录
加入自带装饰器
当加入装饰器后,如果未登录会跳转到登录界面,而此时跳转的默认路径如下:
这里是局部设置):
全局设置:
在配置文件中加上这个值,那么就可以实现全局设置
或者将路由修改一下,后面就可以跳转自定义函数:
Auth模块之退出系统
默认情况下使用的就是auth_user的默认字段
扩展我们自己的字段
前提是:所有的模型类都继承
from django.contrib.auth.models import AbstractUser
不要继承了models.Model
扩展之后需要在配置文件中加一句话
“””””在扩展表之前数据库不能够迁移,扩展这个表需要在迁移数据库之前做”””””
如果你迁移了,还想扩展怎么办?
1. 换库
2. 需要删除很多个应用的migrations文件夹
python manage.py migrate myapp –fake
扩展表之后发生的变化:
1. 原来的auth_user表不存在了,换成你自己新建的表名了
2. 原来的auth_user表中的字段还都在,然后多了自己扩展的字段
3. 继承的类要发生改变AbstractUser
4. 在配置文件中加入下面一句话:
AUTH_USER_MODEL = ‘app01.UserInfo’
AUTH_USER_MODEL = ‘应用名.类名’
5. 扩展之后还是按照原来的auth_user表使用
6. auth模块中的数据还是你扩展的表
7. 扩展之前别迁移.
今天的文章分页器、cookie和session分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/57024.html