django

django四、中间件、session与cookie实现登录注册

2018-06-02  本文已影响0人  Jason_c8d4

session cookie

会话技术,比如在做登录功能的时候,需要配合是用存储在客户端的cookie信息,以及存储在服务端的session来实现登录功能。 在cookie中保存了用户的信息,特别是一个特殊的令牌信息,当用户拿着这个特殊的令牌来访问网站的时候,网站会从cookie中 获取这个特殊令牌去数据库session中去查询是否有这个对应的令牌的信息,如果有则验证成功,就可以把用户的信息返回给客户端 了,如果验证失败则提示用户没有登录等等提示信息。

1. cookie

1.1 描述
浏览器端的回话技术
cookie本身由浏览器生成,通过Response将cookie写在浏览器上,下一次访问,浏览器会根据不同的规则携带cookie过来

1.2 设置cookie
    response.set_cookie(key, value, max_age=None, exprise=None)
    request.GET.get(key)

注意:cookie不能跨浏览器

参数定义:

    max_age :  整数,指定cookie过期时间,以秒为单位
    exprise: 整数,指定过期时间,还支持是一个datetime或者timedelta,可以指定一个具体日期时间
    max_age和exprise两个选一个指定
    过期时间的几个关键时间
    max_age设置为0浏览器关闭失效
    设置位None永不过期
    exprise=timedelta(days=10) 10天后过期


2. session

2.1 描述
服务端会话技术,依赖于cookie

2.2 开启session设置

1)django中启用SESSION 在settings中修改如下地方

    INSTALLED_APPS:
        ‘django.contrib.sessions’
    MIDDLEWARE:
        ‘django.contrib.sessions.middleware.SessionMiddleware’

每个HttpResponse对象都有一个session属性,也是一个类字典对象 讲解cookie和session通信,session_id等

2.3 常用操作

get(key, default=None) 根据键获取会话的值 clear() 清除所有会话 flush() 删除当前的会话数据并删除会话的cookie delete request[‘session_id’] 删除会话 session.session_key 获取session的key 设置数据 request.session[‘user’] = username 数据存储到数据库中会进行编码使用的是base64 注意: Session 支持中文 cookie不支持中文 token自己维护

登录注册

通过cookie和token去实现登录功能,用户在登录账号以后,随机产生一个随机数并存在cookie中,并在服务端也存储同一个数在数据库中。 当下一次url请求过来的时候,解析request中绑定的cookie信息,解锁出之前存的随机数,判断该随机数是否是存储在服务器端的数据,如果 没有查询到则表示该cookie过期,或者该cookie是伪造的,或者服务器上存储该信息的数据缓存到期被清空了。则该提示用户重新登录,并且 重新产生随机数,并存储在cookie中以及服务端,以保证下次请求和响应能够顺利。

操作演示

  1. 编写一个方法,用于注册用户的账号和密码。

  2. 编写一个方法,用于登录用户的账号和密码,并且登录的时候绑定一个加密的参数在cookie上,并且该加密参数也存储在服务端中。

3)在以后的任意一个请求,我们都获取request中的cookies,查看cookie中绑定的参数是否合法,以及查询是否在服务端存储了。

4)如果验证成功则返回请求url的结果信息到页面,如果验证失败则返回错误提醒信息页面

  1. 注销登录

6)定义装饰器去验证用户登录以后才执行对应的视图函数,反之跳转到登录页面中

1. 注册方法

从页面中获取账号和密码,进行创建

image.png

2. 登录,并且绑定参数到cookie上

先检验用户名是否在数据库中,如果查询到则继续验证密码, 如果密码验证对,则绑定一个参数到cookie中。 解析密码,加密密码来源与一下的模块:

from django.contrib.auth.hashersimportcheck_password,make_password
image.png

3. 在方法中验证cookie中传递的参数是否正确

cookie是在用户提交url请求的时候都会带上的一个参数,所以可以从中获取到我们设置的参数,并且在服务端进行验证,看服务端有这个标识符没有, 如果能查询到,则表示用户登录过了,并且还在登录时效内,则直接返回用户提交url对应的响应。如果在服务端没有查询到数据,则表示标识符过期, 或者无效了,需要登录了,则直接提示错误信息即可!

image.png

4. 注销登录

删除cookie中的认证令牌

image.png

5. 通过定义装饰器去验证用户是否是登录状态,如果不是,则跳转到登录

定义装饰器--闭包

image.png

django自带的登录注册

在django中,django帮我们封装好了登录注册以及注销的函数,在下面的代码案例中,我们将使用django定义好的注册登录注销函数去实现用户的登录验证,用户登录,以及用户注销等操作,以及定义login_rqueired装饰器,去装饰我们定义的函数,实现登录才能处理对应的业务逻辑

1. 实现注册方法

1.1 页面提交注册字段

在页面的form中有一下三个字段,用户名和密码1和密码2,页面在submit提交的时候,会提交该三个字段后后端,在后端中获取该参数即可

image.png

1.2 后端处理注册的信息

后端获取前端传递的参数,进行简单的验证后,进行创建用户的信息

image.png

2. 实现登录方法

2.1 登录页面提交登录的字段

image.png

2.2 后端进行登录的验证

image.png

3. 实现注销方法

image.png

中间件

中间件:

a) 是一个轻量级的,底层的插件,可以介入Django的请求和响应的过程(面向切面编程)

b) 中间件的本质就是一个python类

c) 面向切面编程(Aspect Oriented Programming)简称AOP,AOP的主要实现目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获取逻辑过程中各部分之间低耦合的隔离效果

1.1 中间件的处理函数
__init__:没有参数,在服务器响应的第一个请求的时候自动调用,用户确定时候启动该中间件

process_request(self, request): 在执行视图前被调用,每个请求上都会被调用,不主动进行返回或返回HttpResponse对象

process_view(self, request, view_func,view_args, view_kwargs):调用视图之前执行,每个请求都会调用,不主动进行返回或返回HttpResponse对象

process_template_response(self, request, response):在视图刚好执行完后进行调用,每个请求都会调用,不主动进行返回或返回HttpResponse对象

process_response(self, request, response):所有响应返回浏览器之前调用,每个请求都会调用,不主动进行返回或返回HttpResponse对象

process_exception(self, request, exception):当视图抛出异常时调用,不主动进行返回或返回HttpResponse对象

1.2 处理流程
image.png
1.3 自定义中间件流程
  1. 在工程目录下创建middleware目录

  2. 目录中创建一个python文件

  3. 在根据功能需求,创建切入需求类,重写切入点方法

  4.  from django.utils.deprecation import MiddlewareMixin
    
     class AuthUserMiddleWare(MiddlewareMixin):
    
         def process_request(self, request):
    
            print(‘xxxx’)
    
    
  5. 启动中间件,在settings中进行配置,MIDDLEWARE中添加middleware.文件名.类名

image.png
上一篇下一篇

猜你喜欢

热点阅读