Django rest framework 之认证

一、基于token进行用户认证

1、settings

先将rest_framework添加到settings的app里

INSTALLED_APPS = [
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    ‘api‘,   #我自己注册的APP
    ‘rest_framework‘,   #添加restframework
]

2、url

from django.conf.urls import url
from api.apiview import apiview
urlpatterns = [    

  url(r‘^(?P<version>[v1|v2]+)/login_api/$‘, apiview.login_api.as_view()),
]

3、models

创建两张表,一个存用户信息,一个存用户登录后的token

from django.db import models

class user_info(models.Model):
  username = models.CharField(max_length=32,unique=True,verbose_name=‘用户名‘)
  password = models.CharField(max_length=32,verbose_name=‘密码‘)
  nickname = models.CharField(max_length=32,verbose_name=‘昵称‘)

class UserToken(models.Model):
    time = models.DateTimeField(auto_now=True)
    user = models.OneToOneField(to=‘user_info‘,on_delete=None)
    token = models.CharField(max_length=64)

4、views

apiview.py

from django.shortcuts import HttpResponse
from utils.response import BaseResponse
from django.db import models
from api import models
import json
import time

class login_api(object):
    def post(self,request,*args,**kwargs):
        response = BaseResponse()
        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:
                response.code = 400000
                response.error = {            ‘username‘:‘用户名或密码错误‘

          }          response.message = ‘参数错误‘
        return HttpResponse(json.dumps(response.__dict__))

            token_obj = Token()
            token = token_obj.CreateToken(user)
            models.UserToken.objects.update_or_create(user=user,defaults={‘token‘:token,‘time‘:time.time()})

            response.data = {
                ‘token‘:token,
                ‘username‘:user,
                ‘password‘:pwd
            }

        except Exception as e:
            response.error = str(e)
            response.code = 400001
            response.message = ‘请求异常‘

        return HttpResponse(json.dumps(response.__dict__))

token.py

from web import models
import time
from datetime import datetime
import hashlib

class Token(object):
    def CreateToken(self,user):
        ‘‘‘
        创建token username + 时间戳 转换为md5
        :param user:
        :return:
        ‘‘‘
        ctime = str(time.time())
        token = hashlib.md5(bytes(user, encoding=‘utf-8‘))
        token.update(bytes(ctime, encoding=‘utf-8‘))
        return token.hexdigest()

response.py

class BaseResponse(object):
    def __init__(self):
        self.message = ‘OK!‘
        self.data = None
        self.error = None
        self.code = 200

使用postman进行测试

如果用户名和密码正确,会生成token,下次登录时,token的值会更新

当用户名密码错误时,抛出异常

原文地址:https://www.cnblogs.com/zhw3702/p/12362447.html

时间: 2024-11-09 00:54:41

Django rest framework 之认证的相关文章

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

源码剖析Django REST framework的认证方式 由Django的CBV模式流程,可以知道在url匹配完成后,会执行自定义的类中的as_view方法. 如果自定义的类中没有定义as_view方法,根据面向对象中类的继承可以知道,则会执行其父类View中的as_view方法 在Django的View的as_view方法中,又会调用dispatch方法. 现在来看看Django restframework的认证流程 Django restframework是基于Django的框架,所以基

django rest framework 用户认证

BaseAuthentication 类: django rest framework 通过 BaseAuthentication 实现认证功能 无论是自定义的认证类还是 rest framework 自带的认证类都应该继承 BaseAuthentication BaseAuthentication 中有两个方法 authenticate 和 authenticate_header, 其中 authenticate 方法必须实现 如果用户需要自定义认证方法则继承 BaseAuthenticati

Django Rest Framework之认证

代码基本结构 url.py: from django.conf.urls import url, include from web.views.s1_api import TestView urlpatterns = [ url(r'^test/', TestView.as_view()), ] views.py: from rest_framework.views import APIView from rest_framework.response import Response from

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

引言 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任何数据,有客户端请求,我即返回数据,简单方便,每一个http请求都是新的,响应之后立即断开连接. 而如今,互联网的世界发生了翻天覆地的变化,用户不仅仅需要跟其他用户沟通交流,还需要跟服务器交互,不管是论坛类.商城类.社交类.门户类还是其他各类Web站点,大家都非常重视用户交互,只有跟用户交互了,才能

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

1:登录视图 redis_cli.py文件: import redis Pool= redis.ConnectionPool(host='localhost',port=6379,decode_responses=True) 登录视图文件:import redisfrom utils.redis_cli import Pool    # 创建redis连接池 class UserLogin(APIView): """ 用户登陆认证: 登录成功更新token值,并且返回给前端,

Django Rest Framework源码剖析(二)-----权限

一.简介 在上一篇博客中已经介绍了django rest framework 对于认证的源码流程,以及实现过程,当用户经过认证之后下一步就是涉及到权限的问题.比如订单的业务只能VIP才能查看,所以这时候需要对权限进行控制.下面将介绍DRF的权限控制源码剖析. 二.基本使用 这里继续使用之前的示例,加入相应的权限,这里先介绍使用示例,然后在分析权限源码 1.在django 项目下新建立目录utils,并建立permissions.py,添加权限控制: class MyPremission(obje

Django Rest framework 之 权限

一.权限实例 在阅读本文之前请先参考django rest framework 之 认证中关于django rest framework的相关内容及实例 1.目录结构 为了更好的管理各个功能组件,在django rest framework 之 认证中我们说到可以将认证类单独的拿出来,放到其他目录下,然后导入到views.py 文件中,在权限环节我们亦可以这么做,目录结构就变成这样 在api这个app下创建一个utils包专门用来存放相关的组件. 2.为模型类添加认证字段 我们在models.p

Django rest framework 使用自定义认证方式

Django rest framework 使用自定义认证方式 Django使用自定义认证方式 介绍了 "Django使用自定义认证方式",这一篇说说怎样在前一篇的基础上提供rest api. 修改settings.py中INSTALLED_APPS,添加 'login' app. 给login app增加serializers.py文件 #coding:utf-8 from django.contrib.auth.models import User from rest_framew

Django Restful Framework【第三篇】认证、权限、限制访问频率

一.认证 认证请求头 views.py #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.authentication import BaseAuthentication from rest_framework.permissions import