1. # -*- coding: utf-8 -*-
  2. __author__ = 'YongCong Wu'
  3. # @Time : 2018/10/23 15:05
  4. # @Email : : 1922878025@qq.com
  5. from rest_framework import exceptions
  6. from app import models
  7.  
  8. class FirstAuthtication(object):
  9. def authenticate(self, request):
  10. pass
  11.  
  12. def authenticate_header(self, request):
  13. pass
  14.  
  15. class Authtication(object):
  16. def authenticate(self, request):
  17. token = request._request.GET.get('token')
  18. token_obj = models.UserToken.objects.filter(token=token).first()
  19. if not token_obj:
  20. raise exceptions.AuthenticationFailed('用户认证失败')
  21. # 在rest framework内部将整个两个字段赋值给request,以供后续操作使用。
  22. return (token_obj.user, token_obj)
  23.  
  24. def authenticate_header(self, request):
  25. pass

auth.py

  1. from django.shortcuts import render, HttpResponse
  2. from django.contrib.auth.models import User, Group
  3. from rest_framework import viewsets
  4. from app.serializers import UserSerializer, GroupSerializer
  5. from rest_framework.views import APIView
  6. from rest_framework.request import Request
  7. from rest_framework.authentication import BasicAuthentication
  8. from rest_framework import exceptions
  9. from django.http import JsonResponse
  10. from app import models
  11. import hashlib
  12. import time
  13.  
  14. # Create your views here.
  15.  
  16. class UserViewSet(viewsets.ModelViewSet):
  17. queryset = User.objects.all()
  18. serializer_class = UserSerializer
  19.  
  20. class GroupViewSet(viewsets.ModelViewSet):
  21. queryset = Group.objects.all()
  22. serializer_class = GroupSerializer
  23.  
  24. # 生成md5
  25. def md5(user):
  26. ctime = str(time.time())
  27. m = hashlib.md5(bytes(user, encoding='utf-8'))
  28. m.update(bytes(ctime, encoding='utf-8'))
  29. return m.hexdigest()
  30.  
  31. # 请求Token认证
  32. class GetUserData(APIView):
  33. """
  34. 用于用户登陆认证
  35. """
  36. authentication_classes = []
  37. def post(self, request, *args, **kwargs):
  38. ret = {'code': 1000, 'msg': None}
  39. try:
  40. user = request._request.POST.get('username')
  41. pwd = request._request.POST.get('password')
  42. obj = models.UserInfo.objects.filter(username=user, password=pwd).first()
  43. if not obj:
  44. ret['code'] = 1001
  45. ret['msg'] = '用户名或密码错误'
  46. # 为当前登陆用户创建Token
  47. token = md5(user)
  48. models.UserToken.objects.update_or_create(user=obj, defaults={'token':token})
  49. ret['token'] = token
  50. except Exception as e:
  51. ret['code'] = 1002
  52. ret['msg'] = '请求异常'
  53. return JsonResponse(ret)
  54.  
  55. # 测试数据
  56. ORDER_DICT = {
  57. 1: {
  58. 'name': '书包',
  59. 'sku': 1002,
  60. 'price': 500
  61. },
  62. 2: {
  63. 'name': '键盘',
  64. 'sku': 1052,
  65. 'price': 258
  66. }
  67. }
  68.  
  69. class OrderView(APIView):
  70. """
  71. 用于订单 rest framework
  72. """
  73. # 通过authentication_classes添加用户认证
  74. def get(self, request, *args, **kwargs):
  75. """
  76. 用户登陆成功,才可以查看订单数据
  77. """
  78. ret = {'code': 1000, 'msg': None, 'data': None}
  79. try:
  80. ret['data'] = ORDER_DICT
  81. except Exception as e:
  82. pass
  83. return JsonResponse(ret)
  84.  
  85. # 用户中心
  86. class UserInfoView(APIView):
  87. """
  88. 用于订单 rest framework
  89. """
  90. # 通过authentication_classes添加用户认证
  91. def get(self, request, *args, **kwargs):
  92. return HttpResponse('用户信息')

app/views.py

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class UserInfo(models.Model):
  6. user_type_choices = (
  7. (1, '普通用户'),
  8. (2, 'VIP'),
  9. (3, 'SVIP')
  10. )
  11. user_type = models.IntegerField(choices=user_type_choices)
  12. username = models.CharField(max_length=32, unique=True)
  13. password = models.CharField(max_length=64)
  14.  
  15. class UserToken(models.Model):
  16. user = models.OneToOneField(to='UserInfo')
  17. token = models.CharField(max_length=64)

models

  1. # -*- coding:utf-8 -*-
  2.  
  3. from django.conf.urls import url, include
  4. from rest_framework import routers
  5. from app import views
  6.  
  7. # 注册视图
  8. router = routers.DefaultRouter()
  9. router.register(r'users', views.UserViewSet)
  10. router.register(r'groups', views.GroupViewSet)
  11. router.register(r'pwd', views.GroupViewSet)
  12.  
  13. # 二级路由
  14. urlpatterns = [
  15. url(r'apb/',include(router.urls)),
  16. url(r'1/',include(router.urls)),
  17. url(r'auth/$', views.GetUserData.as_view()), # 登陆认证
  18. url(r'order/$', views.OrderView.as_view()) # 订单
  19. ]

app/urls.py

  1. from django.conf.urls import url, include
  2. from django.contrib import admin
  3. from rest_framework import routers, serializers, viewsets
  4. from app import views
  5.  
  6. # django-rest-swagger
  7. from rest_framework.schemas import get_schema_view
  8. from rest_framework_swagger.renderers import SwaggerUIRenderer, OpenAPIRenderer
  9. schema_view = get_schema_view(title='User API', renderer_classes=[OpenAPIRenderer, SwaggerUIRenderer])
  10.  
  11. urlpatterns = [
  12. url(r'^docs/', schema_view, name='docs'),
  13. url(r'^admin/', admin.site.urls),
  14. url(r'^api', include('rest_framework.urls', namespace='rest_framework')),
  15. url(r'^user/', include('app.urls'))

rest_frame_demo/urls.py

settings.py配置全局认证

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_AUTHENTICATION_CLASSES': ['app.utils.auth.FirstAuthtication', 'app.utils.auth.Authtication']
  3. }

settings.py

django-rest-swagger配置

  1. # Swagger样式配置
  2. SWAGGER_SETTINGS = {
  3. 'SECURITY_DEFINITIONS': {
  4. 'basic': {
  5. 'type': 'basic'
  6. }
  7. },
  8. 'LOGIN_URL': 'rest_framework:login',
  9. 'LOGOUT_URL': 'rest_framework:logout',
  10. # 接口文档中方法列表以首字母升序排列
  11. 'APIS_SORTER': 'alpha',
  12. # 如果支持json提交,则接口文档中包含json输入框
  13. 'JSON_EDITOR': True,
  14. # 方法列表字母排序
  15. 'OPERTIONS_SORTER': 'alpha',
  16. 'VALIDATOR_URL': None
  17. }

settings.py

app/serializers.py

  1. # -*- coding:utf-8 -*-
  2. from django.contrib.auth.models import User, Group
  3. from rest_framework import serializers
  4.  
  5. # 返回数据
  6. class UserSerializer(serializers.HyperlinkedModelSerializer):
  7. class Meta:
  8. model = User
  9. fields = ('url', 'username', 'email', 'groups')
  10.  
  11. class GroupSerializer(serializers.HyperlinkedModelSerializer):
  12. class Meta:
  13. model = Group
  14. fields = ('url', 'name')

serializers.py

django-rest-framework登陆认证的更多相关文章

  1. Django Rest framework 之 认证

    django rest framework 官网 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest fra ...

  2. django rest framework用户认证

    django rest framework用户认证 进入rest framework的Apiview @classmethod def as_view(cls, **initkwargs): &quo ...

  3. 【django后端分离】Django Rest Framework之认证系统之redis数据库的token认证(token过期时间)

    1:登录视图 redis_cli.py文件: import redis Pool= redis.ConnectionPool(host='localhost',port=6379,decode_res ...

  4. Django rest framework 的认证流程(源码分析)

    一.基本流程举例: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^users/', views.HostView.as_view() ...

  5. Django REST Framework之认证组件

    什么是认证 认证即需要知道是谁在访问服务器,需要有一个合法身份.认证的方式可以有很多种,例如session+cookie.token等,这里以token为例.如果请求中没有token,我们认为这是未登 ...

  6. DRF Django REST framework 之 认证组件(五)

    引言 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任 ...

  7. Django REST framework 之 认证 权限 限制

    认证是确定你是谁 权限是指你有没有访问这个接口的权限 限制主要是指限制你的访问频率 认证 REST framework 提供了一些开箱即用的身份验证方案,并且还允许你实现自定义方案. 接下类我们就自己 ...

  8. Django Rest Framework之认证

    代码基本结构 url.py: from django.conf.urls import url, include from web.views.s1_api import TestView urlpa ...

  9. 基于django rest framework做认证组件

    先导入要用到的类 from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions ...

  10. 源码剖析Django REST framework的认证方式及自定义认证

    源码剖析Django REST framework的认证方式 在前面说过,请求到达REST framework的时候,会对request进行二次封装,在封装的过程中会对客户端发送过来的request封 ...

随机推荐

  1. web测试项目总结

    一.输入框 1.字符型输入框: (1)字符型输入框:英文全角.英文半角.数字.空或者空格.特殊字符“~!@#¥%……&*?[]{}”特别要注意单引号和&符号.禁止直接输入特殊字符时,使 ...

  2. MongoDB— 细说操作

    基本操作 由于是开篇,就大概的说下基本的“增删查改“,我们再开一个cmd,输入mongo命令打开shell,其实这个shell就是mongodb的客户端, 同时也是一个js的编译器,默认连接的是“te ...

  3. stm32 学习参考(转)

    源:stm32 学习参考 单片机裸机下写一个自己的shell调试器     LWIP_STM32_ENC28J60_NETCONN_TCP_SERVICER(5)     LWIP_STM32_ENC ...

  4. NFS常用命令

    1.客户端查看服务端可挂载卷 showmount -t 服务端IP 2.不重启加载NFS配置文件 exportfs -avr

  5. 20165211 2017-2018-2 《Java程序设计》第5周学习总结

    20165211 2017-2018-2 <Java程序设计>第5周学习总结 教材学习内容总结 本周,我学习了书本上第五.六两章的内容,以下是我整理的主要知识. 第五章 内部类与异常类 内 ...

  6. 将Sublime Text 添加到鼠标右键菜单的教程方法

    安装notepad++软件,在菜单右键自动会添加“edit with notepad++"的选项,那么怎么将Sublime Text 添加到鼠标右键菜单呢?下面是我的操作过程,希望有帮助! ...

  7. springboot集成shiro 前后端分离

    前后端分离情况下 首先考虑是否跨域,如果没有跨域是可以使用shiro原生的session+cookie,无需特别处理. 如果涉及到跨域则需要考虑cookie问题(本质上也是重写shiro获取JESSI ...

  8. MapReduce程序(一)——wordCount

    写在前面:WordCount的功能是统计输入文件中每个单词出现的次数.基本解决思路就是将文本内容切分成单词,将其中相同的单词聚集在一起,统计其数量作为该单词的出现次数输出. 1.MapReduce之w ...

  9. 实现分享功能插件2---jiathis分享插件应用

    博主原创:未经博主允许,不得转载 在上一篇的博文中分享了如何用百度分享插件实现分享功能,现在展示用jiathis进行实现分享功能: 主要代码如下: <body> <div class ...

  10. Windows下搭建FTP服务器

    一.什么是ftp? FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(A ...