APIview 模拟用户登录方法,并设置Token给用户


发布时间:2019-03-18 08:11    作者: Uncle Hui   已过去:1 年   阅读总量:525 已被赞:0


为了学习这个功能,我在项目下新建了一个叫my_api的APP,用于测试。

APIView是REST framework提供的所有视图的基类,继承自Django的View父类。

APIView与View的不同之处在于:

传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;
视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;
任何APIException异常都会被捕获到,并且处理成合适的响应信息;
在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。
支持定义的属性:
authentication_classes 列表或元祖,身份认证类
permissoin_classes 列表或元祖,权限检查类
throttle_classes 列表或元祖,流量控制类
--------------------- 

准备工作:

新建模型:my_api/models.py:

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,verbose_name='用户级别')
    username = models.CharField(max_length=32,verbose_name='用户名字')
    password = models.CharField(max_length=64)

class UserToke(models.Model):
    '''
    用户TOKE
    '''
    user = models.OneToOneField(to='UserInfo',verbose_name='用户关联',on_delete=models.DO_NOTHING)
    token = models.CharField(max_length=64)

注册app,并迁移数据库文件:

 (1) 生成迁移脚本文件: python manage.py  makemigrations   (在CMD里 cd到工程文件下,环境中)
 (2) 映射口令: python manage.py  migrate   (在CMD里 cd到工程文件下,环境中)    

给数据表添加一些测试数据

视图的书写:

from rest_framework.views import APIView
from django.http import JsonResponse
from .models import *
#新建一个处理随机字符串的方法,利用用户名和时间戳
def md5(user):
    import hashlib #这个库是转换成哈希字符串
    import time #时间模块
    ctime = str(time.time()) #获取当前时间并转换成字符串
    #将用户名转成哈希字符串
    m = hashlib.md5(bytes(user,encoding='utf-8'))
    #将时间转换成哈希字符串拼接到m上
    m.update(bytes(ctime,encoding='utf-8'))
    return m.hexdigest()
#利用APIView来做一个用户带着token的登陆请求视图
class Authview(APIView):
    #POST方法
    def post(self,request,*args,**kwargs):
        #正常情况的返回
        ret = {'code':200,'msg':None}
        try:
            #获取POST来的用户名和密码(方法一)
            #user = request._request.POST.get('username')
            #pwd = request._request.POST.get('password')
            # 获取POST来的用户名和密码(方法二)
            user = self.request.POST.get('username')
            pwd = self.request.POST.get('password')
            #去表里查找
            obj = UserInfo.objects.filter(username=user,password=pwd).first()
            #如果没找到就返回错误
            if not obj:
                ret['code'] = 400
                ret['msg'] = '用户名或密码错误'
            #查到就走到这里,生成一个随机TOKEN
            token = md5(user)
            #如果表里有就更新这个token,没有就创建,用update_or_create方法user为表里的用户关联字段
            UserToke.objects.update_or_create(user=obj,defaults={'token':token})
            #将token加进去返回给用户
            ret['token'] = token
        except Exception as e:
            ret['code'] = 404
            ret['msg'] = '请求异常'
        return JsonResponse(ret)

 URL:

path('a/', Authview.as_view()),

打开POSTman,进行测试:

目前我们已经成功获取了返回的JSON,并将TOKEN返回给了用户,接下来我我们进行验证,(待续)

点赞

0




登陆后方可评论