第一版 :

自己写函数实现用户认证

#models
from django.db import models
#用户表
class UserInfo(models.Model):
user_type_choices=((1,'普通用户'),(2,'VIP'),(3,'SVIP'))
user_type = models.IntegerField(choices=user_type_choices)
username = models.CharFiled(max_length=32,uniquw=True)
password = models.CharFiled(max_length=64)
# 用登录成功的token
class UserToken(models.Model):
user = models.OneToOneFiled(to='UserInfo')
token = models.CharFiled(max_length=64)
# urls
uplpatters= [
url(r'^api/v1/auth/$', views.AuthView.as_view()),
] #views
from rest_framework.views import APIView
from api import models # 生成随机字符串
def Md5(user):
import hashlib
import time
ctime = str(time.time())
m = hashlib,md5(bytes(user,encodeing='utf-8'))
m.update(bytes(ctime,encodeing='utf-8'))
return m.hexdigest() class AuthView(APIView):
"""
用户登录认证
"""
def post(self,request,*args,**kwargs):
try:
user = request._reqeust.POST.get('username')
pwd = request._reqeust.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)
# 如果存在token就更新 不存在就创建
models.UserToken.objects.update_or_create(user=obj,defualts={'token':token})
ret['token'] = token
except Exception as e:
ret['code'] = 1002
ret['msg'] = '请求异常'
return JsonResponse() ORDER_DICT = {
1:{
'name': 'x',
'age': 18,
'gender':'y',
'content': '...'
},
2:{
'name': 'z',
'age': 18,
'gender': 'h',
'content': '...'
}
}
class OrderView(APIView):
"""
订单业务
"""
def get(self, request, *args,**kwargs):
# token验证
token = request._reqeust.GET.get('token')
if not token:
return HttpResponse('用户未登录') ret={'code':1000,'msg':None,'data':None}
try:
ret['data'] = ORDER_DICT
except Exception as e:
pass
return JsonResponse(ret)

第二版: 改进版

使用restramework的authentication功能实现用户认证
#models
from django.db import models
#用户表
class UserInfo(models.Model):
user_type_choices=((1,'普通用户'),(2,'VIP'),(3,'SVIP'))
user_type = models.IntegerField(choices=user_type_choices)
username = models.CharFiled(max_length=32,uniquw=True)
password = models.CharFiled(max_length=64)
# 用登录成功的token
class UserToken(models.Model):
user = models.OneToOneFiled(to='UserInfo')
token = models.CharFiled(max_length=64)
# urls
uplpatters= [
url(r'^api/v1/auth/$', views.AuthView.as_view()),
] #views
from rest_framework.views import APIView
from api import models # 生成随机字符串
def Md5(user):
import hashlib
import time
ctime = str(time.time())
m = hashlib,md5(bytes(user,encodeing='utf-8'))
m.update(bytes(ctime,encodeing='utf-8'))
return m.hexdigest() class AuthView(APIView):
"""
用户登录认证
"""
def post(self,request,*args,**kwargs):
try:
user = request._reqeust.POST.get('username')
pwd = request._reqeust.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)
# 如果存在token就更新 不存在就创建
models.UserToken.objects.update_or_create(user=obj,defualts={'token':token})
ret['token'] = token
except Exception as e:
ret['code'] = 1002
ret['msg'] = '请求异常'
return JsonResponse() ORDER_DICT = {
1:{
'name': 'x',
'age': 18,
'gender':'y',
'content': '...'
},
2:{
'name': 'z',
'age': 18,
'gender': 'h',
'content': '...'
}
} from rest_framework.request import Request
from rest_framework import exceptions
class Authtication(object):
"""
用户登录认证类
"""
def authenticate(self, request):
token = request._reqeust.GET.get('token')
token_obj = models.UserToken.objects.filter(token=token).first()
if not token_obj:
raise exceptions.AuthenticationFiled('用户认证失败')
# 在restframework 内部会将这两个字段 赋值给request, 以供后续操作使用
return (token_obj.user, token_obj) def anthentication_header(self,request):
pass class OrderView(APIView):
"""
订单业务
"""
# restframework 自带功能能够验证 用户是否登录
authentication = [Authtication,]
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)

  

rest_framework源码执行流程:

流程:
0-----------
authentication_class = api_settings.DEFAULT_AUTHENTICATION_CLASSES
1-----------
def dispatch():
self.initial(request)
2-----------
def initial():
self.perform_authenticate()
3-----------
def perform_authenticate():
reuqest.user
4-----------
@porperty
def user():
_authenticate()
5-----------
def _anthenticate():
循环认证类所有对象
6-----------
anthentication_class = [Authenticate,]
7-----------
Authenticate() 执行自定义的验证方法
返回 user对象 和 token对象

  

全局配置:

REAT_FRAMEWORK = {
'DEFAULT_AUTNENTICATINO_CLASSES': ['api.utils.auth.Authtication',]
}

  

局部不使用:

class OrderView(APIView):
"""
订单业务
"""
# 写一个空列表 就可以到达不用使用authentication_classes = [Authtication,] 达到不用登录验证的目的
authentication_classes = []
def get(self, request, *args,**kwargs):
return JsonResponse(ret)

  

配置匿名用户:

REAT_FRAMEWORK = {
# 推荐配置restframework的匿名用户为None
"UNAUTHENTCATION_USER": None, # request.user = None
"UNAUTHENTICATION_TOKEN" None, # request.token = None
}

第三版:

继承BaseAuthentication

from  rest_framework.authentication import BaseAuthentication
class Authtication(BaseAuthentication):
"""
用户登录认证类
"""
def authenticate(self, request):
token = request._reqeust.GET.get('token')
token_obj = models.UserToken.objects.filter(token=token).first()
if not token_obj:
raise exceptions.AuthenticationFiled('用户认证失败')
# 在restframework 内部会将这两个字段 赋值给request, 以供后续操作使用
return (token_obj.user, token_obj)

1.  必须继承BaseAuthentication类

2. 必须实现anthenticate方法

Django rest-framework框架-认证组件的简单实例的更多相关文章

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

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

  2. Django REST Framework之认证组件

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

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

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

  4. Django Rest framework 框架之认证使用和源码执行流程

    用这个框架需要先安装: pip3 install djangorestframework 如果写了一个CBV的东西,继承了View. # 继承Django里面View class APIView(Vi ...

  5. Django Rest framework 之 认证

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

  6. Django REST framework框架介绍和基本使用

    Django REST framework介绍 Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API. 官 ...

  7. Django Rest Framework框架 ---- url控制器

    Django Rest Framework框架 ---- url控制器

  8. web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 ☝☝☝

    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 学习 ...

  9. web前端Vue+Django rest framework 框架 生鲜电商项目实战✍✍✍

    web前端Vue+Django rest framework 框架 生鲜电商项目实战  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频 ...

随机推荐

  1. 自定义msi安装包的执行过程

    有时候我们需要在程序中执行另一个程序的安装,这就需要我们去自定义msi安装包的执行过程. 比如我要做一个安装管理程序,可以根据用户的选择安装不同的子产品.当用户选择了三个产品时,如果分别显示这三个产品 ...

  2. Node.js起一个web服务器

    开启服务: 代码如下: var http = require('http'); http.createServer(function (request, response) { // 发送 HTTP ...

  3. Maven打包将依赖的jar一同打进去

    在pom.xml文件中添加: <build> <plugins> <plugin> <artifactId>maven-assembly-plugin& ...

  4. 继承System.Web.UI.Page的页面基类

    服务器端的page类      所有我们编写的页面都继承自page类,可见page类是非常重要的,page类提供了哪些功能,直接决定了我们的页面类可以继承什么功能,或者说,直接决定了我们的页面类功能的 ...

  5. Centos7 系统更改apache默认网站目录(解决You don't have permission to access / on this server问题)

    当我们在Centos7中配置好Apache时,发现apache默认解析目录是在 /var/www/html,也就是说当访问服务器 IP 或者本地 localhost 时, 默认定位到这个目录里的 in ...

  6. 人人都可以写的可视化Python小程序第二篇:旋转的烟花

    兴趣是最好的老师 枯燥的编程容易让人放弃,兴趣才是最好的老师.无论孩子还是大人,只有发现这件事情真的有趣,我们才会非常执着的去做这件事,比如打游戏.如果编程能像玩游戏一样变得有趣,我相信很多人就特别愿 ...

  7. 删除kubernetes-dashboard

    kubectl get secret,sa,role,rolebinding,services,deployments --namespace=kube-system | grep dashboard ...

  8. OpenCV 例程

    采集图片显示视频: #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using n ...

  9. 最新 唯品会java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.唯品会等10家互联网公司的校招Offer,因为某些自身原因最终选择了唯品会.6.7月主要是做系统复习.项目复盘.LeetCo ...

  10. docker 运行pptpd服务器

      今天试着用docker搭了一下pptpd服务器,感觉清爽不少(当然是踩坑之后的啦),特此记录.   使用的镜像: mmontagna/docker-vpn-pptp   由于是现成的镜像,所以我们 ...