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+时间戳+当前用户名来创建。
注:用户登录是不需要任何认证都可以访问,但是后面如果再来访问其他需要登入成功后才可以查看的页面,必须经过认证才可以通过。
浙公网安备 33010602011771号