1.DRF认证组件之视图注册用法(自定义简单使用)

  settings.py配置  

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
'rest_framework',
]

seetings.py

  urls.py:  

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^book/', views.CourseView.as_view(),name='courses'),
]

urls.py

  veiws.py

from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView
from rest_framework import exceptions
# Create your views here. #实例url:http://127.0.0.1:8000/book/?token=1
class MyAuth(object):
def authenticate(self, request):
# 该示例认证是需要在请求的url加上参数token(实际直接是校验用户名或密码或者登陆标识等)
token = request._request.GET.get('token')
if not token:
raise exceptions.AuthenticationFailed('未认证用户!!!')
return ('认证通过的request.user', 'request.auth') # 认证函数执行结果如果通过则为元组,元组第一个元素封装在为request.user,第二个参数封装在request.auth中 def authenticate_header(self, request):
pass class CourseView(APIView):
# 认证组件
authentication_classes = [MyAuth, ] def get(self, request):
print(request.user)#request.user在APIViewD的dispatch中进行封装的
return HttpResponse('GET') def post(self, request):
return HttpResponse('POST') def put(self, request):
return HttpResponse('PUT') def patch(self, request):
return HttpResponse('PATCH') def delete(self, request):
return HttpResponse('DELETE')

veiws.py

2.DRF认证组件的使用(局部和全局)

方式一:局部配置---视图类中添加类变量    authentication_classes=[MyAuth,]---(认证类列表)

  

  settings.py配置见上(注册rest_framework应用)   

  models.py  

from django.db import models

# Create your models here

class UserInfo(models.Model):
"""
用户表
"""
user_type_choices = [
(1, '普通用户'),
(2, 'VIP用户'),
(3, 'SVIP用户'),
]
user_type = models.IntegerField(choices=user_type_choices)
username = models.CharField(max_length=10, unique=True)
password = models.CharField(max_length=12, null=False) class UserToken(models.Model):
"""
token表
""" user = models.OneToOneField(to='UserInfo')
token = models.CharField(max_length=64)
create_time = models.DateTimeField(auto_now=True) class Book(models.Model):
name = models.CharField(max_length=12)

models.py

  urls.py  

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/v1/login', views.AuthView.as_view()),
url(r'^book/', views.CourseView.as_view(),name='courses'),
]

urls.py

  views.py  

from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView
from rest_framework import exceptions
from app01 import models
from django.http import JsonResponse # Create your views here. # 实例url:http://127.0.0.1:8000/book/?token=1
#认证类,每个类使用都需要加上类变量参数authentication_classes = [MyAuth, ]
class MyAuth(object):
def authenticate(self, request):
# 该示例认证是需要在请求的url加上参数token(实际直接是校验用户名或密码或者登陆标识等)
token = request._request.GET.get('token')
token_obj = models.UserToken.objects.get(token=token)
if not token_obj:
raise exceptions.AuthenticationFailed('未认证用户!!!')
return (token_obj.user, 'request.auth') # 认证函数执行结果如果通过则为元组,元组第一个元素封装在为request.user,第二个元素封装为request.auth def authenticate_header(self, request):
pass class CourseView(APIView):
# (1)认证组件
authentication_classes = [MyAuth, ] def get(self, request):
print(request.user) # request.user在认证组件中进行封装的
return HttpResponse('GET') def post(self, request):
return HttpResponse('POST') def put(self, request):
return HttpResponse('PUT') def patch(self, request):
return HttpResponse('PATCH') def delete(self, request):
return HttpResponse('DELETE') import time
import hashlib def token_md5(username):
"""
自定义token
:param username:
:return:
"""
t = time.time()
md5 = hashlib.md5(str(t).encode('utf-8'))
md5.update(username.encode('utf-8'))
return md5.hexdigest() class AuthView(APIView): def post(self, request):
"""
用户登录
:param request:进行封装之后的request对象
:return: 登录结果信息
"""
ret = {'code': 0, 'msg': ''}
print(request._request.POST)
username = request._request.POST.get('username', None)
password = request._request.POST.get('password', None) # 每次登陆如果有就更新没有就创建
try:
user_obj = models.UserInfo.objects.filter(username=username, password=password).first()
if user_obj:
token = token_md5(username)
print(token)
# 每次登陆如果有就更新没有就创建
models.UserToken.objects.update_or_create(user=user_obj, defaults={'token': token})
ret['msg'] = '登陆成功!'
ret['token'] = token
else:
ret['code'] = 1
ret['msg'] = '账号或密码有误!!!' except Exception as e:
ret['code'] = 2
ret['msg'] = '未知错误!!!'
finally:
return JsonResponse(ret)

views.py

方式二:全局配置----在settings.py配置文件中加载REST_FRAMEWORK配置

  

  settings.py  

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
'rest_framework',
] REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES' : ['app01.utils.auth.MyAuth',],#可以自定义多个认证类
'UNAUTHENTICATED_USER':lambda :'匿名用户request.user自定义值',#request.user有默认值,可以直接写None
'UNAUTHENTICATED_TOKEN':lambda :'request.auth自定义值',#request.auth有默认值,可以直接写None
}

seetings.py

  utils--auth.py--MyAuth认证类  

from rest_framework import exceptions
from app01 import models class MyAuth(object):
def authenticate(self, request):
# 该示例认证是需要在请求的url加上参数token(实际直接是校验用户名或密码或者登陆标识等)
token = request._request.GET.get('token')
token_obj = models.UserToken.objects.get(token=token)
if not token_obj:
raise exceptions.AuthenticationFailed('未认证用户!!!')
return (token_obj.user, 'request.auth') # 认证函数执行结果如果通过则为元组,元组第一个元素封装在为request.user,第二个元素封装为request.auth def authenticate_header(self, request):
pass

  models.py

from django.db import models

# Create your models here

class UserInfo(models.Model):
"""
用户表
"""
user_type_choices = [
(1, '普通用户'),
(2, 'VIP用户'),
(3, 'SVIP用户'),
]
user_type = models.IntegerField(choices=user_type_choices)
username = models.CharField(max_length=10, unique=True)
password = models.CharField(max_length=12, null=False) class UserToken(models.Model):
"""
token表
""" user = models.OneToOneField(to='UserInfo')
token = models.CharField(max_length=64)
create_time = models.DateTimeField(auto_now=True) class Book(models.Model):
name = models.CharField(max_length=12)

models.py

  urls.py  

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/v1/login', views.AuthView.as_view()),
url(r'^book/', views.CourseView.as_view(),name='courses'),
]

urls.py

  views.py  

from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView
from rest_framework import exceptions
from app01 import models
from django.http import JsonResponse # 实例url:http://127.0.0.1:8000/book/?token=1
class CourseView(APIView):
# (1)认证组件
authentication_classes = [MyAuth, ] def get(self, request):
print(request.user) #request.user在APIViewD的dispatch中进行封装的
return HttpResponse('GET') def post(self, request):
return HttpResponse('POST') def put(self, request):
return HttpResponse('PUT') def patch(self, request):
return HttpResponse('PATCH') def delete(self, request):
return HttpResponse('DELETE') import time
import hashlib def token_md5(username):
"""
自定义token
:param username:
:return:
"""
t = time.time()
md5 = hashlib.md5(str(t).encode('utf-8'))
md5.update(username.encode('utf-8'))
return md5.hexdigest() class AuthView(APIView):
#如果不注册自定义组件,走默认的认证,最后返回了request.user和request.auth都是匿名用户默认值,可以在settings.py中加载自定义配置
def post(self, request):
"""
用户登录
:param request:进行封装之后的request对象
:return: 登录结果信息
"""
ret = {'code': 0, 'msg': ''}
print(request._request.POST)
username = request._request.POST.get('username', None)
password = request._request.POST.get('password', None) # 每次登陆如果有就更新没有就创建
try:
user_obj = models.UserInfo.objects.filter(username=username, password=password).first()
if user_obj:
token = token_md5(username)
print(token)
# 每次登陆如果有就更新没有就创建
models.UserToken.objects.update_or_create(user=user_obj, defaults={'token': token})
ret['msg'] = '登陆成功!'
ret['token'] = token
else:
ret['code'] = 1
ret['msg'] = '账号或密码有误!!!' except Exception as e:
ret['code'] = 2
ret['msg'] = '未知错误!!!'
finally:
return JsonResponse(ret)

views.py

3.DRF认证组件的继承类(常用)

  

  utils--auth.py--MyAuth认证类  

from rest_framework import exceptions
from app01 import models from rest_framework.authentication import BaseAuthentication,BasicAuthentication # 实例url:http://127.0.0.1:8000/book/?token=1
#认证类(可以定义多个):
# 方式一:每个类使用都需要加上类变量参数authentication_classes = [MyAuth, ]
#方式二:在setings.py配置中加载REST_FRAMEWORK配置----'DEFAULT_AUTHENTICATION_CLASSES' : [], # class MyAuth(object):
class MyAuth(BaseAuthentication):#可以直接继承BaseAuthentication类,可以省略authenticate_header方法,或者继承BasicAuthentication
def authenticate(self, request):
# 该示例认证是需要在请求的url加上参数token(实际直接是校验用户名或密码或者登陆标识等)
token = request._request.GET.get('token')
token_obj = models.UserToken.objects.get(token=token)
if not token_obj:
raise exceptions.AuthenticationFailed('未认证用户!!!')
return (token_obj.user', 'request.auth') # 认证函数执行结果如果通过则为元组,元组第一个元素封装在为request.user # def authenticate_header(self, request):
# pass

utils--auth.py--MyAuth认证类

  settings.py

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
'rest_framework',
] REST_FRAMEWORK = {
#认证组件
'DEFAULT_AUTHENTICATION_CLASSES' : ['app01.utils.auth.MyAuth',],#可以自定义多个认证类
'UNAUTHENTICATED_USER':lambda :'匿名用户request.user自定义值',#request.user有默认值,可以直接写None
'UNAUTHENTICATED_TOKEN':lambda :'request.auth自定义值',#request.auth有默认值,可以直接写None
}

seetings.py

 

DRF认证组件的更多相关文章

  1. drf认证组件、权限组件、jwt认证、签发、jwt框架使用

    目录 一.注册接口 urls.py views.py serializers.py 二.登录接口 三.用户中心接口(权限校验) urls.py views.py serializers.py 四.图书 ...

  2. drf认证组件(介绍)、权限组件(介绍)、jwt认证、签发、jwt框架使用

    目录 一.注册接口 urls.py views.py serializers.py 二.登录接口 三.用户中心接口(权限校验) urls.py views.py serializers.py 四.图书 ...

  3. DRF认证组件流程分析

    视图函数中加上认证功能,流程见下图 import hashlib import time def get_random(name): md = hashlib.md5() md.update(byte ...

  4. Django框架之DRF 认证组件源码分析、权限组件源码分析、频率组件源码分析

    认证组件 权限组件 频率组件

  5. DRF框架(六)——三大认证组件之认证组件、权限组件

    drf认证组件 用户信息表 from django.db import models from django.contrib.auth.models import AbstractUser class ...

  6. 【DRF认证】

    目录 认证组件的详细用法 本文详细讲述了DRF认证组件的原理以及用法. @ * 源码剖析** 上一篇博客讲解DRF版本的时候我们都知道了,在dispatch方法里执行了initial方法来初始化我们的 ...

  7. drf视图组件、认证组件

    视图组件 1.基本视图 url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)/$', vi ...

  8. DRF框架之认证组件用法(第四天)

    1. 什么是drf 框架的认证组件: auth 就等于是jango中的Auth模块,Auth是自带session信息,但是 drf的认证组件可以自定义token携带过去,去判断用的 2.如何实现认证呢 ...

  9. DRF 之 认证组件

    1.认证的作用? 我们知道,当我们在网站上登陆之后,就会有自己的个人中心,之类的可以对自己的信息进行修改.但是http请求又是无状态的,所以导致我们每次请求都是一个新的请求,服务端每次都需要对请求进行 ...

随机推荐

  1. Playbook中标签的使用(五)

    一个playbook文件中,执行时如果想执行某一个任务,那么可以给每个任务集进行打标签,这样在执行的时候可以通过-t选择指定标签执行, 还可以通过--skip-tags选择除了某个标签外全部执行等 [ ...

  2. Pascal 字符串

    Dancing with Strings http://baskent.edu.tr/~tkaracay/etudio/ders/prg/pascal/PasHTM1/pas/pasl1007.htm ...

  3. opencv-5-图像遍历与图像改变

    opencv-5-图像遍历与图像改变 opencvc++qt 目录 目录 开始 图像的像素点访问与遍历 opencv 座标定义 下标访问 指针访问 迭代器法访问 遍历访问时间对比 图像操作 图像叠加 ...

  4. LeetCode7-ReverseInteger

    LeetCode7-ReverseInteger LeetCodeeasyOverflow 题目 题目所在链接为 LeetCode-7:ReverseInteger 题目描述 给出一个32位的有符号整 ...

  5. java并发Exchanger的使用

    目录 简介 类定义 类继承 构造函数 两个主要方法 具体的例子 结语 简介 Exchanger是java 5引入的并发类,Exchanger顾名思义就是用来做交换的.这里主要是两个线程之间交换持有的对 ...

  6. 使用spring boot创建fat jar APP

    文章目录 介绍 build和run fat jar和 fat war 更多配置 介绍 在很久很很久以前,我们部署web程序的方式是怎么样的呢?配置好服务器,将自己写的应用程序打包成war包,扔进服务器 ...

  7. 【Linux网络基础】 DNS:介绍、作用、解析原理

    1. DNS是什么?   DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去+·记住能够被机器直接读 ...

  8. Vue 结合 echarts 原生 html5 实现拖拽排版报表系统

    前言 不知道各位 coder 有没有碰到过许多重复的业务需求,比如排版相类似的报表,只不过是顺序稍微换了一下,就是一个新的页面,虽然基于模板思想来写的话也能减少不少代码,但是相对的不那么方便,笔者最近 ...

  9. 使用Node.js的http-serve搭建本地服务器

    为什么要使用它? 首先,类似于vue-cli创建的项目,都能够实现浏览器中自动刷新,实时查看项目效果.其中的原理在于,webpack这样的工具启动了一个本地服务器,将本机当作一台服务器,这样在浏览器中 ...

  10. Mysql 查看被锁住的表

    MYSQL  查看被锁住的表 -- 本文章仅用于学习,记录   当你在mysql 执行查询语句的时候,简单的一句查询语句却卡很久,一直转圈圈的时候,这时候你就需要怀疑数据库的哪些进程,哪些事物被锁住 ...