Django restframework实现用户认证(登录之后才可以访问的视图编写)

今天学习restframework开发,关于这一块不再过多介绍,只是介绍关于django 的开发,预备知识:
restful api 知识,以下内容都是跟着B站的教程学的。
要实现的功能:有些页面和函数必须在登录之后才可以访问,我们可以导入django 的相应模块,在该函数上面加一个@longin_require 装饰器即可,现在我们介绍如何通过restframework 来实现,顺便再看部分源码。
还有以前在写的时候,POST与GET请求要进行判断,每个函数的前面都要加上if request.method==‘POST’…,使用restframework 框架,它会帮我们自行判断,一会在源码里进行介绍它是如何区分的。

1. 建表、创建用户

首先创建了一个名为django 项目,在里面创建一个名为api 的APP,这一块不过多介绍,建成后手动添加几个数据用来测试(使用图片的原因是代码看起来比较直观)
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第1张图片
手动在user表添加几个数据进行测试
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第2张图片
在views.py 文件里,编写登录验证程序
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第3张图片
以上就是登录的验证的程序,下来分别介绍每部的作用以及对源码进行解析。
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第4张图片
这个函数怎么来的,下面会慢慢介绍。

1. APIView

通过Pycharm 的快捷键: Alt + 鼠标点住,可以查看一个函数的源码,我们点进去查看,在470行的位置会看到一个self.dispatch 的函数,查看函数,发现request 被重新定义
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第5张图片
点进去查看initialize_request 方法,发现它多返回了几个参数
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第6张图片
再查看self.get_authenticators() 函数,发现它返回的是一个列表推导式,再网上查看就回到了默认的设置,这个一会再介绍。
查看self.initial 方法,看到它也返回好几个参数,分别代表不同的认证
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第7张图片
查看self.perform_authentication这个详细的方法,会看到它调用的是request.user,再次查看user方法
它又调用self._authenticate()方法
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第8张图片
发现它会循环进行验证,也就是可以自定义验证方法,并且放回两个对象
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第9张图片
至此,关于源码分析就这些,下面我们通过测试,来验证某些需要登录才能访问的页面。

2. 验证程序

通过PostMan 来测试,我们的登录程序是否成功。
api.views 文件, 在url.py 加入相应的路径

class AuthView(APIView):
	def post(self, request, *args, **kwargs):
		# 设置一个默认的返回参数
		ret = {'code': 1000, 'msg': None}
		username = request._request.POST.get('username')
		password = request._request.POST.get('password')
		obj = models.User.objects.filter(username=username, password=password).first()
		if not obj:
			ret['code'] = '1001'
			ret['msg'] = '用户名或者密码错误'
			return JsonResponse(ret)
		# 这里为了简单,应该是进行加密,再加上其他参数
		token = str(time.time()) + username
		models.UserToken.objects.update_or_create(username=obj, defaults={'token': token})
		ret['msg'] = '登录成功'
		ret['token'] = token
		return JsonResponse(ret)

通过测试,我们可以看到以下页面,表示成功(以下的参数是我在数据库提前插入的)
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第10张图片
下来我们编写另一个类试图,这个类是必须经过登录才能访问的。
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第11张图片
在url添加的路由,通过PostMan 测试,会看到返回的数值。
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第12张图片
现在编写一个验证类,(忘了写try, 将获取、验证token都写入try, raise 还是下面的不变)
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第13张图片

现在需要登录才能访问的OrderView 视图加入这个验证类。
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第14张图片
再次打开PostMan ,进行测试,发现已经获取不到数据。
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第15张图片
现在从数据库手动拿到token, 当作参数传递给后端,会发现可以获取到数据
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第16张图片
至此,简单的通过需要验证才能访问的类视图已经编写完毕,有人说,写了这么多,还不如一个@login_require 方便,目前来看是的,但是restframework 还可以加入多个验证
Django restframework实现用户认证(登录之后才可以访问的视图编写)_第17张图片
我们可以写多个不同的验证类试图,需要加入验证的类也可以加入不同的验证类,从而是可以实现内容管理管理系统的。
假如某个类不需要验证,就不要加authentication_classes, 或者令其为空。

3. 写在最后

Django restframework实现用户认证(登录之后才可以访问的视图编写)_第18张图片

你可能感兴趣的:(Django)