django-rest-framework登陆认证
- # -*- coding: utf-8 -*-
- __author__ = 'YongCong Wu'
- # @Time : 2018/10/23 15:05
- # @Email : : 1922878025@qq.com
- from rest_framework import exceptions
- from app import models
- class FirstAuthtication(object):
- def authenticate(self, request):
- pass
- def authenticate_header(self, request):
- pass
- class Authtication(object):
- def authenticate(self, request):
- token = request._request.GET.get('token')
- token_obj = models.UserToken.objects.filter(token=token).first()
- if not token_obj:
- raise exceptions.AuthenticationFailed('用户认证失败')
- # 在rest framework内部将整个两个字段赋值给request,以供后续操作使用。
- return (token_obj.user, token_obj)
- def authenticate_header(self, request):
- pass
auth.py
- from django.shortcuts import render, HttpResponse
- from django.contrib.auth.models import User, Group
- from rest_framework import viewsets
- from app.serializers import UserSerializer, GroupSerializer
- from rest_framework.views import APIView
- from rest_framework.request import Request
- from rest_framework.authentication import BasicAuthentication
- from rest_framework import exceptions
- from django.http import JsonResponse
- from app import models
- import hashlib
- import time
- # Create your views here.
- class UserViewSet(viewsets.ModelViewSet):
- queryset = User.objects.all()
- serializer_class = UserSerializer
- class GroupViewSet(viewsets.ModelViewSet):
- queryset = Group.objects.all()
- serializer_class = GroupSerializer
- # 生成md5
- def md5(user):
- ctime = str(time.time())
- m = hashlib.md5(bytes(user, encoding='utf-8'))
- m.update(bytes(ctime, encoding='utf-8'))
- return m.hexdigest()
- # 请求Token认证
- class GetUserData(APIView):
- """
- 用于用户登陆认证
- """
- authentication_classes = []
- def post(self, request, *args, **kwargs):
- ret = {'code': 1000, 'msg': None}
- try:
- user = request._request.POST.get('username')
- pwd = request._request.POST.get('password')
- obj = models.UserInfo.objects.filter(username=user, password=pwd).first()
- if not obj:
- ret['code'] = 1001
- ret['msg'] = '用户名或密码错误'
- # 为当前登陆用户创建Token
- token = md5(user)
- models.UserToken.objects.update_or_create(user=obj, defaults={'token':token})
- ret['token'] = token
- except Exception as e:
- ret['code'] = 1002
- ret['msg'] = '请求异常'
- return JsonResponse(ret)
- # 测试数据
- ORDER_DICT = {
- 1: {
- 'name': '书包',
- 'sku': 1002,
- 'price': 500
- },
- 2: {
- 'name': '键盘',
- 'sku': 1052,
- 'price': 258
- }
- }
- class OrderView(APIView):
- """
- 用于订单 rest framework
- """
- # 通过authentication_classes添加用户认证
- def get(self, request, *args, **kwargs):
- """
- 用户登陆成功,才可以查看订单数据
- """
- ret = {'code': 1000, 'msg': None, 'data': None}
- try:
- ret['data'] = ORDER_DICT
- except Exception as e:
- pass
- return JsonResponse(ret)
- # 用户中心
- class UserInfoView(APIView):
- """
- 用于订单 rest framework
- """
- # 通过authentication_classes添加用户认证
- def get(self, request, *args, **kwargs):
- return HttpResponse('用户信息')
app/views.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=32, unique=True)
- password = models.CharField(max_length=64)
- class UserToken(models.Model):
- user = models.OneToOneField(to='UserInfo')
- token = models.CharField(max_length=64)
models
- # -*- coding:utf-8 -*-
- from django.conf.urls import url, include
- from rest_framework import routers
- from app import views
- # 注册视图
- router = routers.DefaultRouter()
- router.register(r'users', views.UserViewSet)
- router.register(r'groups', views.GroupViewSet)
- router.register(r'pwd', views.GroupViewSet)
- # 二级路由
- urlpatterns = [
- url(r'apb/',include(router.urls)),
- url(r'1/',include(router.urls)),
- url(r'auth/$', views.GetUserData.as_view()), # 登陆认证
- url(r'order/$', views.OrderView.as_view()) # 订单
- ]
app/urls.py
- from django.conf.urls import url, include
- from django.contrib import admin
- from rest_framework import routers, serializers, viewsets
- from app import views
- # django-rest-swagger
- from rest_framework.schemas import get_schema_view
- from rest_framework_swagger.renderers import SwaggerUIRenderer, OpenAPIRenderer
- schema_view = get_schema_view(title='User API', renderer_classes=[OpenAPIRenderer, SwaggerUIRenderer])
- urlpatterns = [
- url(r'^docs/', schema_view, name='docs'),
- url(r'^admin/', admin.site.urls),
- url(r'^api', include('rest_framework.urls', namespace='rest_framework')),
- url(r'^user/', include('app.urls'))
rest_frame_demo/urls.py
settings.py配置全局认证
- REST_FRAMEWORK = {
- 'DEFAULT_AUTHENTICATION_CLASSES': ['app.utils.auth.FirstAuthtication', 'app.utils.auth.Authtication']
- }
settings.py
django-rest-swagger配置
- # Swagger样式配置
- SWAGGER_SETTINGS = {
- 'SECURITY_DEFINITIONS': {
- 'basic': {
- 'type': 'basic'
- }
- },
- 'LOGIN_URL': 'rest_framework:login',
- 'LOGOUT_URL': 'rest_framework:logout',
- # 接口文档中方法列表以首字母升序排列
- 'APIS_SORTER': 'alpha',
- # 如果支持json提交,则接口文档中包含json输入框
- 'JSON_EDITOR': True,
- # 方法列表字母排序
- 'OPERTIONS_SORTER': 'alpha',
- 'VALIDATOR_URL': None
- }
settings.py
app/serializers.py
- # -*- coding:utf-8 -*-
- from django.contrib.auth.models import User, Group
- from rest_framework import serializers
- # 返回数据
- class UserSerializer(serializers.HyperlinkedModelSerializer):
- class Meta:
- model = User
- fields = ('url', 'username', 'email', 'groups')
- class GroupSerializer(serializers.HyperlinkedModelSerializer):
- class Meta:
- model = Group
- fields = ('url', 'name')
serializers.py
django-rest-framework登陆认证的更多相关文章
- Django Rest framework 之 认证
django rest framework 官网 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest fra ...
- django rest framework用户认证
django rest framework用户认证 进入rest framework的Apiview @classmethod def as_view(cls, **initkwargs): &quo ...
- 【django后端分离】Django Rest Framework之认证系统之redis数据库的token认证(token过期时间)
1:登录视图 redis_cli.py文件: import redis Pool= redis.ConnectionPool(host='localhost',port=6379,decode_res ...
- Django rest framework 的认证流程(源码分析)
一.基本流程举例: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^users/', views.HostView.as_view() ...
- Django REST Framework之认证组件
什么是认证 认证即需要知道是谁在访问服务器,需要有一个合法身份.认证的方式可以有很多种,例如session+cookie.token等,这里以token为例.如果请求中没有token,我们认为这是未登 ...
- DRF Django REST framework 之 认证组件(五)
引言 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任 ...
- Django REST framework 之 认证 权限 限制
认证是确定你是谁 权限是指你有没有访问这个接口的权限 限制主要是指限制你的访问频率 认证 REST framework 提供了一些开箱即用的身份验证方案,并且还允许你实现自定义方案. 接下类我们就自己 ...
- Django Rest Framework之认证
代码基本结构 url.py: from django.conf.urls import url, include from web.views.s1_api import TestView urlpa ...
- 基于django rest framework做认证组件
先导入要用到的类 from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions ...
- 源码剖析Django REST framework的认证方式及自定义认证
源码剖析Django REST framework的认证方式 在前面说过,请求到达REST framework的时候,会对request进行二次封装,在封装的过程中会对客户端发送过来的request封 ...
随机推荐
- web测试项目总结
一.输入框 1.字符型输入框: (1)字符型输入框:英文全角.英文半角.数字.空或者空格.特殊字符“~!@#¥%……&*?[]{}”特别要注意单引号和&符号.禁止直接输入特殊字符时,使 ...
- MongoDB— 细说操作
基本操作 由于是开篇,就大概的说下基本的“增删查改“,我们再开一个cmd,输入mongo命令打开shell,其实这个shell就是mongodb的客户端, 同时也是一个js的编译器,默认连接的是“te ...
- stm32 学习参考(转)
源:stm32 学习参考 单片机裸机下写一个自己的shell调试器 LWIP_STM32_ENC28J60_NETCONN_TCP_SERVICER(5) LWIP_STM32_ENC ...
- NFS常用命令
1.客户端查看服务端可挂载卷 showmount -t 服务端IP 2.不重启加载NFS配置文件 exportfs -avr
- 20165211 2017-2018-2 《Java程序设计》第5周学习总结
20165211 2017-2018-2 <Java程序设计>第5周学习总结 教材学习内容总结 本周,我学习了书本上第五.六两章的内容,以下是我整理的主要知识. 第五章 内部类与异常类 内 ...
- 将Sublime Text 添加到鼠标右键菜单的教程方法
安装notepad++软件,在菜单右键自动会添加“edit with notepad++"的选项,那么怎么将Sublime Text 添加到鼠标右键菜单呢?下面是我的操作过程,希望有帮助! ...
- springboot集成shiro 前后端分离
前后端分离情况下 首先考虑是否跨域,如果没有跨域是可以使用shiro原生的session+cookie,无需特别处理. 如果涉及到跨域则需要考虑cookie问题(本质上也是重写shiro获取JESSI ...
- MapReduce程序(一)——wordCount
写在前面:WordCount的功能是统计输入文件中每个单词出现的次数.基本解决思路就是将文本内容切分成单词,将其中相同的单词聚集在一起,统计其数量作为该单词的出现次数输出. 1.MapReduce之w ...
- 实现分享功能插件2---jiathis分享插件应用
博主原创:未经博主允许,不得转载 在上一篇的博文中分享了如何用百度分享插件实现分享功能,现在展示用jiathis进行实现分享功能: 主要代码如下: <body> <div class ...
- Windows下搭建FTP服务器
一.什么是ftp? FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(A ...