分页器、cookie和session

分页器、cookie和session推导分页器原理 分页:当我们要展示的数据特别多的时候,一页展示不完,这个时候我们需要把展示的数据分成多页展示。 分页需要的几个参数: 1、总数据有多少条 2、每页展示多少条数据 3、一共展示多少页 4、总页数=总数据量/每页展示多少条数据 5、当前第几页(前端传过去的) 推导,了解不用掌握代码: 后

推导分页器原理

分页:当我们要展示的数据特别多的时候,一页展示不完,这个时候我们需要把展示的数据分成多页展示。

分页需要的几个参数:

1、总数据有多少条

2、每页展示多少条数据

3、一共展示多少页

4、总页数=总数据量/每页展示多少条数据

5、当前第几页(前端传过去的)

推导,了解不用掌握代码:

后端:

分页器、cookie和session

 前端:

分页器、cookie和session

 

分页类的使用

分页器封装代码链接: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

 

cookie和session的介绍

HTTP协议的特性之一:无状态

背景信息:

1. 早期的时候一些网站都是静态网站,不需要登录,比如:新闻类、博客等
2. 随着技术的发展以及用户的要求,诞生了诸如支付宝、淘宝、京东等电商网站,这些网站就必须要求用户登录,如果不登录,上家怎么知道是谁买的东西? 登录的目的其实就是上架可以识别这个用户是谁
3. 诞生了保存用户状态的技术:cookie和session

登录功能为例:

  cookie的原理:

    以淘宝为例,当进入淘宝网页,第一次是需要登录的,如果登录成功,淘宝不保存用户信息,下次访问就需要重新登录,每一次访问页面都要登录,用户体验感就会很差

  为了解决上述问题就利用到了cookie,比如第一次登录成功,django后端就让浏览器把用户名和密码保存在浏览器中,下次访问淘宝页面时候,浏览器会自动把之前保存的用户名和密码再次验证。

  上述做法,数据会不够安全

解决不安全问题,是做优化,把原本存在浏览器上的数据存到后端,就称之为session,

session解决了cookie数据不安全问题

session的原理:

  以登录为例:  

    第一次登录成功之后,把用户信息保存在后端,其中,django默认是把用户信息保存在数据表中。(django_session表中)

1、先生成一个随机字符串

2、把用户信息保存在django_session表中

分页器、cookie和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一定就不能工作了,对还是不对?

 

Django操作cookie

obj = HttpResponse
return obj

obj = render
return obj

obj = redirect
return obj

# 操作cookie的时候,就用到了这个obj对象

案例:

分页器、cookie和session

 

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的空间

分页器、cookie和session

设置session:

分页器、cookie和session

设置session后在这里查看:

分页器、cookie和session

 获取session:

分页器、cookie和session

清空session:

分页器、cookie和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添加装饰器

先写出登录和装饰器

分页器、cookie和session

 第一种方式:

分页器、cookie和session

 第二种方式:

分页器、cookie和session

 第三种方式:

分页器、cookie和session

 

中间件

中间件它的执行位置在web服务网关接口之后,在路由匹配之前执行的

django中自带七个中间件

分页器、cookie和session

 每个中间件都有自己独立的功能,也支持我们自己定义中间件

只要跟全局相关都可以用中间件来实现

如何定义中间件

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

”’这几个方法并不是都要全写,而是,需要几个你就写几个!”’

自定义中间键步骤

随便拿一个视图举例:

分页器、cookie和session

1、在项目名下或者任意的应用名下创建一个文件夹

分页器、cookie和session

2、在这个文件夹下面创建一个py文件

3、在该py文件中写一个自定义的类必须要继承 MiddlewareMixin

4、写完之后要去配置文件中注册中间件

分页器、cookie和session

 自定义中间件

分页器、cookie和session

 总结:会先走

process_request,当所有同级别的走完后会走视图,然后走

process_response
如果有return,会从头走到有return的request,然后返回走response
遵循
Django框架的请求生命周期流程图。
 

csrf跨站请求

 钓鱼网站

 本质:form表单
username
shenfenzheng
<input type=’text’ name=’正规的’>

 冒牌的
<input type=’text’ >

<input type=’hidden’ name=’冒牌的’>   #这个是隐藏看不到的,就会进入冒牌

如何避免:后端要做验证,提交过来的数据是不是我之前返回的表单

加一个随机串

form表单:

加了下面这句话后前端会出现一段随机串

分页器、cookie和session

ajax(第一和第二种方式):

分页器、cookie和session

 第三种方式:

在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

分页器、cookie和session

 

csrf跨站请求的相关装饰器

Django中有一个中间件对csrf跨站做了验证,我只要把csrf的这个中间件打开,意味着所有方法都要被验证

在所有视图函数中:

只有几个视图函数做验证,只有几个视图函数不做验证

csrf_protect:哪个视图函数加了这个装饰器,这个函数就会做验证

csrf_exempt:哪个视图函数加了这个装饰器,这个函数就不会验证

导入模块:

from django.views.decorators.csrf import csrf_exempt,csrf_protect

csrf_protect

分页器、cookie和session

 csrf_exempt

分页器、cookie和session

 

CBV验证:

分页器、cookie和session

 

Auth模块使用

auth模块是django自带的用户认证模块:

Auth模块是Django自带的用户认证模块:

我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。

Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统–auth,它默认使用 auth_user 表来存储用户数据。

 在执行数据库迁移命令的时候,会自动生成一个默认的表,其中有auth_开头的很多表
 auth_user表的作用:djagno自带的后台管理系统所依赖的数据就在这张表中
默认情况下,auth_user表是空表,没有用户名和密码,因此我们需要自己创建用户数据
需要创建一个超级管理员账号才能登录
python38 manage.py createsuperuser

分页器、cookie和session

 python38 manage.py createsuperuser:创建超级管理员

分页器、cookie和session

 创建用户后就可以访问login页面

Auth模块相关方法

登录功能、注册功能、修改密码、退出系统、认证功能等

登录功能:

分页器、cookie和session

 验证是否登录

分页器、cookie和session

 加入自带装饰器

分页器、cookie和session

 当加入装饰器后,如果未登录会跳转到登录界面,而此时跳转的默认路径如下:

分页器、cookie和session

如果想要修改默认跳转路径,则加入下面的值(
这里是局部设置):

分页器、cookie和session

分页器、cookie和session

全局设置:

在配置文件中加上这个值,那么就可以实现全局设置

分页器、cookie和session

 或者将路由修改一下,后面就可以跳转自定义函数:

分页器、cookie和session

 

 Auth模块之退出系统

分页器、cookie和session

 

Auth模块之修改密码功能

分页器、cookie和session

 

Auth模块之注册功能

分页器、cookie和session

 

扩展默认的auth_user表

默认情况下使用的就是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

(0)
编程小号编程小号
上一篇 2023-08-26 07:46
下一篇 2023-08-26 08:11

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注