基于Django的Rest Framework框架的认证组件

0|1一、认证组件的作用

  在一个程序中有一些功能是需要登录才能使用的,原生Django中的auth组件可以用来解决这个认证问题,drf框架中也有对应的认证组件来解决这个问题。

  • models.py
from django.db import models

# Create your models here.

class User(models.Model):
    name = models.CharField(max_length=16)
    pwd = models.CharField(max_length=16)

class TokenUser(models.Model):
    token = models.CharField(max_length=256)
    user = models.OneToOneField(to=‘User‘,null=True,on_delete=models.SET_NULL,db_constraint=False)

class Book(models.Model):
    name = models.CharField(max_length=16)
    price = models.IntegerField()
    publish_date = models.DateField()
  • myserializer.py  序列化
from rest_framework import serializers
from app01 import models

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = ‘__all__‘

    def validate(self, attrs):
        return attrs

0|1二、自定义版登录验证组件

  • urls.py
"""blog_test URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  url(r‘^$‘, views.home, name=‘home‘)
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  url(r‘^$‘, Home.as_view(), name=‘home‘)
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r‘^blog/‘, include(‘blog.urls‘))
"""
from django.conf.urls import url
from django.contrib import admin
from app01.views import BooksView, BookView,Login

urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^Login/$‘, Login.as_view()),
    url(r‘^Books/$‘, BooksView.as_view()),
    url(r‘^Books/(?P<pk>\d+)/$‘, BookView.as_view()),
]
  • myauth.py  自定义验证类
from rest_framework.authentication import BaseAuthentication
from app01.models import TokenUser
from rest_framework.exceptions import AuthenticationFailed

class MyAuthentication():
    #验证过程
    def authenticate(self, request):
        token = request.GET.get(‘token‘)
        token_user = TokenUser.objects.filter(token=token).first()
        if token_user:
            return token_user.user,token
        else:
            raise AuthenticationFailed(‘你还未登录,请先登录‘)

    def authenticate_header(self, request):
        pass
  • views.py 视图类
from django.shortcuts import render
from rest_framework.response import Response

# Create your views here.
from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView
from app01 import models
from app01.myserializer import BookSerializer
from rest_framework.views import APIView
from app01.myAuth import MyAuthentication

class BooksView(ListCreateAPIView):
    authentication_classes = [MyAuthentication]  #加上验证的类,如果有多个,会从做到右依次验证
    queryset = models.Book.objects.all()
    serializer_class = BookSerializer

class BookView(RetrieveUpdateDestroyAPIView):
    authentication_classes = [MyAuthentication]
    queryset = models.Book.objects.all()
    serializer_class = BookSerializer

import uuid
#登录
class Login(APIView):
    def post(self,request):
        name = request.data.get(‘name‘)
        pwd = request.data.get(‘pwd‘)
        user = models.User.objects.filter(name=name,pwd=pwd).first()
        if user:
            token = uuid.uuid4()
            models.TokenUser.objects.update_or_create(user=user,defaults={"token":token})
            response = {"status":100,"message":"登录成功"}
        else:
            response = {"status": 200, "message": "登录失败"}
        return Response(response)

结果:登录后会在数据库中生成一个token,用get请求将其发送,观察各个请求的结果。

结果1:

结果2:

0|1三、继承BaseAuthentication的类的登录验证组件

  • myauth.py
from rest_framework.authentication import BaseAuthentication
from app01.models import TokenUser
from rest_framework.exceptions import AuthenticationFailed

class MyAuthentication():
    #验证过程
    def authenticate(self, request):
        token = request.GET.get(‘token‘)
        token_user = TokenUser.objects.filter(token=token).first()
        if token_user:
            return token_user.user,token
        else:
            raise AuthenticationFailed(‘你还未登录,请先登录‘)

其他代码一致

0|1四、认证组件的使用方式

1.局部使用:在需要使用登录验证的视图类中写上变量  authentication_classes= [ 验证类名,]

2.全局使用:在settings.py配置文件中,加入 REST_FRAMEWORK = {‘DEFAULT_AUTHENTICATION_CLASSES’:‘验证类的具体位置例如(app01.myauth.MyAuthenyicatin)‘}

3.全局使用,局部禁用:在全局使用的基础上,在不需要验证的视图类中,将变量 authentication_classes 改为 [ ]  即 authentication_classes =  [ ]

0|1五、认证组件源代码分析

原文地址:https://www.cnblogs.com/wanglei957/p/11129715.html

时间: 2024-10-08 02:13:03

基于Django的Rest Framework框架的认证组件的相关文章

基于Django的Rest Framework框架的频率组件

0|1一.频率组件的作用 在我们平常浏览网站的时候会发现,一个功能你点击很多次后,系统会让你休息会在点击,这其实就是频率控制,主要作用是限制你在一定时间内提交请求的次数,减少服务器的压力. modles.py 0|1二.自定义频率组件类 #(1)取出访问者ip # (2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走 # (3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内

基于Django的Rest Framework框架的序列化组件

本文目录 一 Django自带序列化组件 二 rest-framework序列化之Serializer 三 rest-framework序列化之ModelSerializer 四 生成hypermedialink(极少数) 五 序列化组件之请求数据校验和保存功能 序列化组件源码分析 回到目录 一 Django自带序列化组件 详见 回到目录 二 rest-framework序列化之Serializer models部分: from django.db import models # Create

Django:(6)用户认证组件 &amp; 中间件

用户认证组件 用户认证组件: 功能:用session记录登陆验证状态 前提:用户表:django自带的auth_user 创建超级用户的命令: python manage.py createsuperuser API: (1)from django.contrib import auth (auth模块的方法) 1. # 做验证:如果 验证成功 返回 user 对象(就是 auth_user 这张表中的一条记录对象),否则返回None user = auth.authenticate(usern

DAY99 - Rest Framework(四)- 认证组件和权限组件

一.认证组件 1.使用 # 模型层 class User(models.Model): name = models.CharField(max_length=32) pwd = models.CharField(max_length=32) class UserToken(models.Model): user = models.OneToOneField(to='User') token = models.CharField(max_length=64) #myAuth.py from app

django的rest framework框架——04

一.rest framework的分页 1.使用rest framework内置类PageNumberPagination实现分类 from django.conf.urls import url from api import views urlpatterns = [ url(r'^(?P<version>[v1|v2]+)/pager1/$', views.Pager1View.as_view()), ] urls.py from rest_framework.views import

2、基于Python下的web框架之中最具有代表性的一个——Django

是,许多成功的网站和app都基于Django(Uber.Instagram),开放源代码,遵从BSD版权,采用MVC的软件设计模式,及模型M,视图V和控制器C. (BSD:伯克利软件发行版,开源许可协议,保护原始作者的身份,至少得到身份认可,还可以防止其它人将产品据为己有) 如何使用django orm批量创建数据? def bulk_create(self, objs, batch_size=None):     # 批量插入     # batch_size表示一次插入的个数     obj

Django REST framework 之JWT认证

Json Web Token 1.JWT简介 JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法.JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名.它具备两个特点: 简洁(Compact) 可以通过URL, POST 参数或者在 HTTP header 发送,因为数据量小,传输速度快 自包含(Self-contained) 负载中包含了所有用户所需要的信息,避免了多次查询数据库 2.JWT 组成

DRF (Django REST framework) 框架介绍

Web应用模式 在开发Web应用中,有两种应用模式: 前后端不分离 前后端分离 1 前后端不分离 在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高. 这种应用模式比较适合纯网页应用,但是当后端对接App时,App可能并不需要后端返回一个HTML网页,而仅仅是数据本身,所以后端原本返回网页的接口不再适用于前端App应用,为了对接App后端还需再开发一套接口. 2 前后端分离 在前后端分离的应用模式中,后端仅返

Django REST framework 之 API认证

RESTful API 认证 和 Web 应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过 sessions 或 cookies 维护, 常用的做法是每个请求都发送一个秘密的 access token 来认证用户, 由于 access token 可以唯一识别和认证用户, API 请求应通过 HTTPS 来防止 man-in-the-middle(MitM)中间人攻击. 通