今天学习restframework开发,关于这一块不再过多介绍,只是介绍关于django 的开发,预备知识:
restful api 知识,以下内容都是跟着B站的教程学的。
要实现的功能:有些页面和函数必须在登录之后才可以访问,我们可以导入django 的相应模块,在该函数上面加一个@longin_require 装饰器即可,现在我们介绍如何通过restframework 来实现,顺便再看部分源码。
还有以前在写的时候,POST与GET请求要进行判断,每个函数的前面都要加上if request.method==‘POST’…,使用restframework 框架,它会帮我们自行判断,一会在源码里进行介绍它是如何区分的。
1. 建表、创建用户
首先创建了一个名为django 项目,在里面创建一个名为api 的APP,这一块不过多介绍,建成后手动添加几个数据用来测试(使用图片的原因是代码看起来比较直观)
手动在user表添加几个数据进行测试
在views.py 文件里,编写登录验证程序
以上就是登录的验证的程序,下来分别介绍每部的作用以及对源码进行解析。
这个函数怎么来的,下面会慢慢介绍。
1. APIView
通过Pycharm 的快捷键: Alt + 鼠标点住,可以查看一个函数的源码,我们点进去查看,在470行的位置会看到一个self.dispatch 的函数,查看函数,发现request 被重新定义
点进去查看initialize_request 方法,发现它多返回了几个参数
再查看self.get_authenticators() 函数,发现它返回的是一个列表推导式,再网上查看就回到了默认的设置,这个一会再介绍。
查看self.initial 方法,看到它也返回好几个参数,分别代表不同的认证
查看self.perform_authentication这个详细的方法,会看到它调用的是request.user,再次查看user方法
它又调用self._authenticate()方法
发现它会循环进行验证,也就是可以自定义验证方法,并且放回两个对象
至此,关于源码分析就这些,下面我们通过测试,来验证某些需要登录才能访问的页面。
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)
通过测试,我们可以看到以下页面,表示成功(以下的参数是我在数据库提前插入的)
下来我们编写另一个类试图,这个类是必须经过登录才能访问的。
在url添加的路由,通过PostMan 测试,会看到返回的数值。
现在编写一个验证类,(忘了写try, 将获取、验证token都写入try, raise 还是下面的不变)
现在需要登录才能访问的OrderView 视图加入这个验证类。
再次打开PostMan ,进行测试,发现已经获取不到数据。
现在从数据库手动拿到token, 当作参数传递给后端,会发现可以获取到数据
至此,简单的通过需要验证才能访问的类视图已经编写完毕,有人说,写了这么多,还不如一个@login_require 方便,目前来看是的,但是restframework 还可以加入多个验证
我们可以写多个不同的验证类试图,需要加入验证的类也可以加入不同的验证类,从而是可以实现内容管理管理系统的。
假如某个类不需要验证,就不要加authentication_classes, 或者令其为空。
3. 写在最后
