django rest framework之用户登录

今日内容

       后端可以将随机字符串通过返回值的形式给到前端。前端再写到浏览器的cookie。

       用户要拿个人资料信息,要将浏览器中的cookie里面的随机字符串给前端,由前端加在url上再发请求给后端,ps:[随机字符串可以带在url上,在CORS(跨站资源共享,即跨域),最好加在url上,因为加在请求头上,还要自己去定义请求头,发的是复杂请求,得发两次,先域检再发请求。放在cookie也行,本质是一样的,但是放在url上最简单。]

       示例: http://www.oldboyedu.com/api/v1/order/?token =asidufokajsdfasdf   前端将随机字符串加在url上发这个请求给后端。

后端去url拿到作判断,这个动作可以在视图函数和中间件,都可以去url上拿到token。

 今日内容:

1、认证

      问题:有些API需要用户登录成功之后,才能访问:有些无需登录就能访问。

       b.基本使用认证组件

        解决:

               a.创建两张表:一张用户表,一张存用户登录成功的的token的表

 

               b.用户登录(返回到token并将token保存到数据库)

   

 

 

 

 基于认证实现Api的判断的代码:

一:创建表

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', on_delete=models.CASCADE)
    token = models.CharField(max_length=64)

 

 

激活APP:

 

 并输入生成牵移文件以及映射牵移文件命令到数据库。

填写数据:

 

 

 

 二:写API,用户要先登录。

先写url:

from django.contrib import admin
from django.urls import path
from api import views

urlpatterns = [
    path(r'admin/', admin.site.urls),
    # path(r'api/v1/auth/$', views.AuthView.as_view()),
]

 

 

 在view.py中:

from django.shortcuts import render
from django.http import JsonResponse
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, encodings='utf-8'))
    m.update(bytes(ctime, encodings='utf-8'))
    return m.hexdigest()



class AuthView(APIView):

    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)

代码的一些解释:

 主管改过的代码:

import hashlib
import time

from django.shortcuts import render
from django.http import JsonResponse
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, encoding='utf-8'))
    m.update(bytes(ctime, encoding='utf-8'))
    return m.hexdigest()


class AuthView(APIView):
    # 用户输入用户名和密码用的post请求
    def post(self, request, *args, **kwargs):

        ret = {}
        # 获取用户名和密码,去数据库进行检测
        try:

            print("---11----")
            user = request._request.POST.get('username')
            pwd = request._request.POST.get('password')
            obj = models.UserInfo.objects.filter(username=user, password=pwd).first()  # 拿User对象,拿到了表示登录成功
            # 没登录成功
            if not obj:
                print("---22---")
                ret['code'] = 1001
                ret['msg'] = '用户名或密码错误'
            print("---25---")
            # 为登录用户创建token
            token = md5(user)
            print("---33---")
            # 存在就更新,不存在就创建
            models.UserToken.objects.update_or_create(user=obj, defaults={'token': token})
            print("---44---")
            ret['code'] = 200
            ret['msg'] = 'OK'


        except Exception as e:
            ret['code'] = 10004
            ret['msg'] = '不OK'

        return JsonResponse(ret)

注:token的原理讲解:(token就是后端返回的随机字符串)用户在网吧A登入将账号和密码传给后端,后端返回一组随机字符串给用户,用户凭借这个token来进行访问接口。

如果用户在网吧B用相同的账户密码登入时,会将已经存在的token进行更新,而用户在A网吧就不能在访问接口了,第一是为了安全性考虑,服务器可以进行设置,这也是为什么PC端或者移动端都只可以登入一个账号的原来。

 注:用户输入用户名和密码用的post请求,一般登录用的是post请求,检测并创建token表,每一次输入一个post请求,token如果原来存在就要进行更新,如果原来不存在就要新建。

注:token随机字符串通过md5+时间戳+当前用户名来创建。

注:用户登录是不需要任何认证都可以访问,但是后面如果再来访问其他需要登入成功后才可以查看的页面,必须经过认证才可以通过。

posted @ 2022-05-26 09:46  费皿啊  阅读(733)  评论(0)    收藏  举报