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

  settings.py配置  

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'app01.apps.App01Config',
  9. 'rest_framework',
  10. ]

seetings.py

  urls.py:  

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from app01 import views
  4.  
  5. urlpatterns = [
  6. url(r'^admin/', admin.site.urls),
  7. url(r'^book/', views.CourseView.as_view(),name='courses'),
  8. ]

urls.py

  veiws.py

  1. from django.shortcuts import render, HttpResponse
  2. from rest_framework.views import APIView
  3. from rest_framework import exceptions
  4. # Create your views here.
  5.  
  6. #实例url:http://127.0.0.1:8000/book/?token=1
  7. class MyAuth(object):
  8. def authenticate(self, request):
  9. # 该示例认证是需要在请求的url加上参数token(实际直接是校验用户名或密码或者登陆标识等)
  10. token = request._request.GET.get('token')
  11. if not token:
  12. raise exceptions.AuthenticationFailed('未认证用户!!!')
  13. return ('认证通过的request.user', 'request.auth') # 认证函数执行结果如果通过则为元组,元组第一个元素封装在为request.user,第二个参数封装在request.auth中
  14.  
  15. def authenticate_header(self, request):
  16. pass
  17.  
  18. class CourseView(APIView):
  19. # 认证组件
  20. authentication_classes = [MyAuth, ]
  21.  
  22. def get(self, request):
  23. print(request.user)#request.userAPIViewDdispatch中进行封装的
  24. return HttpResponse('GET')
  25.  
  26. def post(self, request):
  27. return HttpResponse('POST')
  28.  
  29. def put(self, request):
  30. return HttpResponse('PUT')
  31.  
  32. def patch(self, request):
  33. return HttpResponse('PATCH')
  34.  
  35. def delete(self, request):
  36. return HttpResponse('DELETE')

veiws.py

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

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

  

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

  models.py  

  1. from django.db import models
  2.  
  3. # Create your models here
  4.  
  5. class UserInfo(models.Model):
  6. """
  7. 用户表
  8. """
  9. user_type_choices = [
  10. (1, '普通用户'),
  11. (2, 'VIP用户'),
  12. (3, 'SVIP用户'),
  13. ]
  14. user_type = models.IntegerField(choices=user_type_choices)
  15. username = models.CharField(max_length=10, unique=True)
  16. password = models.CharField(max_length=12, null=False)
  17.  
  18. class UserToken(models.Model):
  19. """
  20. token表
  21. """
  22.  
  23. user = models.OneToOneField(to='UserInfo')
  24. token = models.CharField(max_length=64)
  25. create_time = models.DateTimeField(auto_now=True)
  26.  
  27. class Book(models.Model):
  28. name = models.CharField(max_length=12)

models.py

  urls.py  

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from app01 import views
  4.  
  5. urlpatterns = [
  6. url(r'^admin/', admin.site.urls),
  7. url(r'^api/v1/login', views.AuthView.as_view()),
  8. url(r'^book/', views.CourseView.as_view(),name='courses'),
  9. ]

urls.py

  views.py  

  1. from django.shortcuts import render, HttpResponse
  2. from rest_framework.views import APIView
  3. from rest_framework import exceptions
  4. from app01 import models
  5. from django.http import JsonResponse
  6.  
  7. # Create your views here.
  8.  
  9. # 实例url:http://127.0.0.1:8000/book/?token=1
  10. #认证类,每个类使用都需要加上类变量参数authentication_classes = [MyAuth, ]
  11. class MyAuth(object):
  12. def authenticate(self, request):
  13. # 该示例认证是需要在请求的url加上参数token(实际直接是校验用户名或密码或者登陆标识等)
  14. token = request._request.GET.get('token')
  15. token_obj = models.UserToken.objects.get(token=token)
  16. if not token_obj:
  17. raise exceptions.AuthenticationFailed('未认证用户!!!')
  18. return (token_obj.user, 'request.auth') # 认证函数执行结果如果通过则为元组,元组第一个元素封装在为request.user,第二个元素封装为request.auth
  19.  
  20. def authenticate_header(self, request):
  21. pass
  22.  
  23. class CourseView(APIView):
  24. # (1)认证组件
  25. authentication_classes = [MyAuth, ]
  26.  
  27. def get(self, request):
  28. print(request.user) # request.user在认证组件中进行封装的
  29. return HttpResponse('GET')
  30.  
  31. def post(self, request):
  32. return HttpResponse('POST')
  33.  
  34. def put(self, request):
  35. return HttpResponse('PUT')
  36.  
  37. def patch(self, request):
  38. return HttpResponse('PATCH')
  39.  
  40. def delete(self, request):
  41. return HttpResponse('DELETE')
  42.  
  43. import time
  44. import hashlib
  45.  
  46. def token_md5(username):
  47. """
  48. 自定义token
  49. :param username:
  50. :return:
  51. """
  52. t = time.time()
  53. md5 = hashlib.md5(str(t).encode('utf-8'))
  54. md5.update(username.encode('utf-8'))
  55. return md5.hexdigest()
  56.  
  57. class AuthView(APIView):
  58.  
  59. def post(self, request):
  60. """
  61. 用户登录
  62. :param request:进行封装之后的request对象
  63. :return: 登录结果信息
  64. """
  65. ret = {'code': 0, 'msg': ''}
  66. print(request._request.POST)
  67. username = request._request.POST.get('username', None)
  68. password = request._request.POST.get('password', None)
  69.  
  70. # 每次登陆如果有就更新没有就创建
  71. try:
  72. user_obj = models.UserInfo.objects.filter(username=username, password=password).first()
  73. if user_obj:
  74. token = token_md5(username)
  75. print(token)
  76. # 每次登陆如果有就更新没有就创建
  77. models.UserToken.objects.update_or_create(user=user_obj, defaults={'token': token})
  78. ret['msg'] = '登陆成功!'
  79. ret['token'] = token
  80. else:
  81. ret['code'] = 1
  82. ret['msg'] = '账号或密码有误!!!'
  83.  
  84. except Exception as e:
  85. ret['code'] = 2
  86. ret['msg'] = '未知错误!!!'
  87. finally:
  88. return JsonResponse(ret)

views.py

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

  

  settings.py  

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'app01.apps.App01Config',
  9. 'rest_framework',
  10. ]
  11.  
  12. REST_FRAMEWORK = {
  13. 'DEFAULT_AUTHENTICATION_CLASSES' : ['app01.utils.auth.MyAuth',],#可以自定义多个认证类
  14. 'UNAUTHENTICATED_USER':lambda :'匿名用户request.user自定义值',#request.user有默认值,可以直接写None
  15. 'UNAUTHENTICATED_TOKEN':lambda :'request.auth自定义值',#request.auth有默认值,可以直接写None
  16. }

seetings.py

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

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

  models.py

  1. from django.db import models
  2.  
  3. # Create your models here
  4.  
  5. class UserInfo(models.Model):
  6. """
  7. 用户表
  8. """
  9. user_type_choices = [
  10. (1, '普通用户'),
  11. (2, 'VIP用户'),
  12. (3, 'SVIP用户'),
  13. ]
  14. user_type = models.IntegerField(choices=user_type_choices)
  15. username = models.CharField(max_length=10, unique=True)
  16. password = models.CharField(max_length=12, null=False)
  17.  
  18. class UserToken(models.Model):
  19. """
  20. token表
  21. """
  22.  
  23. user = models.OneToOneField(to='UserInfo')
  24. token = models.CharField(max_length=64)
  25. create_time = models.DateTimeField(auto_now=True)
  26.  
  27. class Book(models.Model):
  28. name = models.CharField(max_length=12)

models.py

  urls.py  

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from app01 import views
  4.  
  5. urlpatterns = [
  6. url(r'^admin/', admin.site.urls),
  7. url(r'^api/v1/login', views.AuthView.as_view()),
  8. url(r'^book/', views.CourseView.as_view(),name='courses'),
  9. ]

urls.py

  views.py  

  1. from django.shortcuts import render, HttpResponse
  2. from rest_framework.views import APIView
  3. from rest_framework import exceptions
  4. from app01 import models
  5. from django.http import JsonResponse
  6.  
  7. # 实例url:http://127.0.0.1:8000/book/?token=1
  8. class CourseView(APIView):
  9. # (1)认证组件
  10. authentication_classes = [MyAuth, ]
  11.  
  12. def get(self, request):
  13. print(request.user) #request.user在APIViewD的dispatch中进行封装的
  14. return HttpResponse('GET')
  15.  
  16. def post(self, request):
  17. return HttpResponse('POST')
  18.  
  19. def put(self, request):
  20. return HttpResponse('PUT')
  21.  
  22. def patch(self, request):
  23. return HttpResponse('PATCH')
  24.  
  25. def delete(self, request):
  26. return HttpResponse('DELETE')
  27.  
  28. import time
  29. import hashlib
  30.  
  31. def token_md5(username):
  32. """
  33. 自定义token
  34. :param username:
  35. :return:
  36. """
  37. t = time.time()
  38. md5 = hashlib.md5(str(t).encode('utf-8'))
  39. md5.update(username.encode('utf-8'))
  40. return md5.hexdigest()
  41.  
  42. class AuthView(APIView):
  43. #如果不注册自定义组件,走默认的认证,最后返回了request.user和request.auth都是匿名用户默认值,可以在settings.py中加载自定义配置
  44. def post(self, request):
  45. """
  46. 用户登录
  47. :param request:进行封装之后的request对象
  48. :return: 登录结果信息
  49. """
  50. ret = {'code': 0, 'msg': ''}
  51. print(request._request.POST)
  52. username = request._request.POST.get('username', None)
  53. password = request._request.POST.get('password', None)
  54.  
  55. # 每次登陆如果有就更新没有就创建
  56. try:
  57. user_obj = models.UserInfo.objects.filter(username=username, password=password).first()
  58. if user_obj:
  59. token = token_md5(username)
  60. print(token)
  61. # 每次登陆如果有就更新没有就创建
  62. models.UserToken.objects.update_or_create(user=user_obj, defaults={'token': token})
  63. ret['msg'] = '登陆成功!'
  64. ret['token'] = token
  65. else:
  66. ret['code'] = 1
  67. ret['msg'] = '账号或密码有误!!!'
  68.  
  69. except Exception as e:
  70. ret['code'] = 2
  71. ret['msg'] = '未知错误!!!'
  72. finally:
  73. return JsonResponse(ret)

views.py

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

  

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

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

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

  settings.py

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'app01.apps.App01Config',
  9. 'rest_framework',
  10. ]
  11.  
  12. REST_FRAMEWORK = {
  13. #认证组件
  14. 'DEFAULT_AUTHENTICATION_CLASSES' : ['app01.utils.auth.MyAuth',],#可以自定义多个认证类
  15. 'UNAUTHENTICATED_USER':lambda :'匿名用户request.user自定义值',#request.user有默认值,可以直接写None
  16. 'UNAUTHENTICATED_TOKEN':lambda :'request.auth自定义值',#request.auth有默认值,可以直接写None
  17. }

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. 【转帖】Python 重复造轮子/造轮子找模子,你都应该熟读该文

    Chardet,字符编码探测器,可以自动检测文本.网页.xml的编码. colorama,主要用来给文本添加各种颜色,并且非常简单易用. Prettytable,主要用于在终端或浏览器端构建格式化的输 ...

  2. 设计数据库 ER 图太麻烦?不妨试试这两款工具,自动生成数据库 ER 图!!!

    忙,真忙 点赞再看,养成习惯,微信搜索『程序通事』,关注就完事了! 点击查看更多精彩的文章 这两个星期真是巨忙,年前有个项目因为各种莫名原因,一直拖到这个月才开始真正测试.然后上周又接到新需求,马不停 ...

  3. 移动端上传图片(引入exif-js,图片被压缩为base64)

    <template> <div class="vue-box"> <img :src="imgUrl" alt="&qu ...

  4. openlayers3中Overlay用法

    Overlay 从名字看,是覆盖图.覆盖物的意思,主要的用途就是在地图之上再覆盖一层,用以显示额外的可见元素,可见元素一般是 HTML 元素,利用 overlay,可以将可见元素放置到地图的任意位置, ...

  5. SpringMVC Root WebApplicationContext启动流程

    传统的SpringMVC项目中,需要在web.xml中配置Contextlistener.ContextLoaderListener是负责引导启动和关闭Spring的Root上下文的监听器.主要将处理 ...

  6. javascript阻止子元素继承父元素事件

    $('.box').on('click', function (e) { if(e.target == this) { console.log(e.target) } })

  7. windows下flume 采集如何支持TAILDIR和tail

    一.问题:Windows 下 flume采集配置TAILDIR的时候,会报如下错误: agent.sources.seqGenSrc.type = TAILDIR agent.sources.seqG ...

  8. Java集合面试题汇总篇

    文章收录在 GitHub JavaKeeper ,N线互联网开发必备技能兵器谱 作为一位小菜 "一面面试官",面试过程中,我肯定会问 Java 集合的内容,同时作为求职者,也肯定会 ...

  9. Educational Codeforces Round 77 (Rated for Div. 2) C. Infinite Fence

    C. Infinite Fence 题目大意:给板子涂色,首先板子是顺序的,然后可以涂两种颜色,如果是r的倍数涂成红色,是b的倍数涂成蓝色, 连续的k个相同的颜色则不能完成任务,能完成任务则输出OBE ...

  10. B. Math Show 暴力 C - Four Segments

    B. Math Show 这个题目直接暴力,还是有点难想,我没有想出来,有点思维. #include <cstdio> #include <cstdlib> #include ...