大家好,这是皮爷给大家带来的最新的学习Python能干啥?之Django教程的进阶版。
很抱歉这篇文章更新的晚了,原因是皮爷这段时间一直在日本换工作,经过一个月的煎熬,最后终于拿到了想要去的公司的offer。以后可以将peekpa.com和工作相结合,创建更加牛逼的peekpa.com 同时为大家制作更加详细的,有内容的教程。
在之前《用Django全栈开发》系列专辑里面,皮爷详细的阐述了如何编写一个完整的网站,具体效果可以浏览线上网站:Peekpa.com
从进阶篇开始,每一篇文章都是干货满满,干的不行。这一节,我们来说:如何通过Django REST Framework来实现Token验证。为我们的前后端分离做最后的准备
Peekpa.com的官方地址:http://peekpa.com
获取整套教程源码唯一途径,关注『皮爷撸码』,回复『peekpa.com』
皮爷的每一篇文章,都配置相对应的代码。这篇文章的代码对应的Tag是“Advanced_11”。
背景了解
我们这里所说的验证,英文实际是Authentication。为什么要提到这个?原因很简单,在未来我们前后端分离的程序中,当我们前端登录了后台系统之后,随后每一次发送的HTTP请求,我们都要想一个办法来确认这个HTTP请求正好是那个登录过的人发送的,而不是中间黑客劫持或者伪造的,这样,我们就需要让HTTP请求在发送的过程中,携带一个验证身份的东西,这个验证身份的东西,就是我们今天所说的Token Authentication。
当然,在实际的生产过程中,我们的验证方式其实有很多,但是这里我们就先拿来Django REST Framework提供的TokenAuthentication来试验一下。
相关的TokenAuthentication参考文档,可以去查阅官方文档:
https://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication
我们这里想要验证的,当然就是我们当时前后端分离的数据中心页面了。
集成Token Authentication
第一步,当然是要修改我们的setting.py
文件了。我们需要将以下内容添加进去:
INSTALLED_APPS = [
### ...先前内容省略...
'rest_framework.authtoken',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
]
}
这里简单说明一下:
-
DEFAULT_AUTHENTICATION_CLASSES
这个是: -
DEFAULT_PERMISSION_CLASSES
这个是:
然后,我们需要修改我们的User Model,即peekpauser/model.py
文件里,我们需要添加以下内容:
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
这里的功能就是,当我们创建一个用户的时候,我们就会创建自动创建一个Token,并且这个Token关联到这个用户的。
既然我们修改了Model,而且我们也在INSTALLED_APPS
里面也添加了新的rest_framework.authtoken
,那么我们接下来就要执行python manage.py makemigrations
和python manage.py migrate
了,执行完成,我们会在数据库中生成Authon Token的表格:
接下来一步,我们在
peekpauser
目录下,创建一个admin.py
文件,并将下面的代码放进去:
from django.contrib import admin
from .models import User
class PeekpaUserAdmin(admin.ModelAdmin):
pass
admin.site.register(User, PeekpaUserAdmin)
这样做的目的是在我们的Django自带的Admin页面里面,将PeekpaUser加入进去。
添加完了之后,我们启动程序。并且来到http://127.0.0.1:8000/admin/
页面,通过超级管理员账号登录进来:
看到这里有三个内容:Tokens, Users和 Groups。
我们这里需要使用到的就是Tokens和Users。
我们可以在回到我们之前写好的Dashboard页面http://127.0.0.1:8000/cms/dashboard/
,然后在User里面创建一个新的User:
我们这里只是为了测试,所以简单一点:账号:[email protected],密码:peekpa。然后点击确定。
创建好之后,我们再回到我们的Admin页面,来看一下发生了什么。首先进入User页面:
看到新创建的
[email protected]
是成功创建出来的;接着我们去看一下Token页面:
看到这里,在创建新用户的时候,系统自动生成了一个与之匹配的Token,值为
0db104f47f1fec1d4f179a6ca369b691c060848c
,并且关联到的User是我们刚刚创建的[email protected]
用户。
这里就说明,我们的Token Authentication已经完成了50%了,那么我们接着继续。
使用Token Authentication
既然,我们要使用Token验证,首先第一步就是要拿到Token。
拿到Token有两种方法:
- 用Django REST Framework自带的
obtain_auth_token
方法可以获取; - 就是自己写一个方法,在登录成功的时候,将Token吐给前端出来。
我们这里就先使用第一种方法来给大家展示一下,咱们先把流程都跑通了,再优化。
首先,我们需要将函数路径修改一下,映射到obtain_auth_token
方法中,直接修改Peekpa/urls.py
文件里面,添加一下代码:
from rest_framework.authtoken.views import obtain_auth_token
urlpatterns = [
### ...先前内容过多,省略...
path('api-auth/', obtain_auth_token)
]
这个obtain_auth_token
方法只接受POST请求,需要传入登录账号的参数,即email
和password
这两个。所以我们打开我们的Postman来测试一下:
看到,方法是POST
,路径是http://127.0.0.1:8000/api-token/
,传入两个参数email
和password
,返回结果则是我们的Token,就是之前所生成的对应[email protected]
这个账号的token:0db104f47f1fec1d4f179a6ca369b691c060848c
这里如果传入的参数不对,则会返回其他错误信息,这个大家可以下去自行试验一下。
接下来,我们就是要如何使用这个Token了。
我们的试想,是要通过上一节所讲的数据中心异步请求接口,通过传入参数以及Token,来给我们返回结果。那么我们就这么干。
如果想要在视图函数里面使用Token的验证,我们需要稍微修改一下视图函数。上节课我们写的API函数是CenterApiView
,对应的URL是center/data/
,在没有修改之前,我们的接口http://127.0.0.1:8000/center/data/
返回结果是这一个样子:
为了融合Token,我们这里就把
CenterApiView
稍微修改一下:
from rest_framework.permissions import IsAuthenticated
from rest_framework.authentication import TokenAuthentication
class CenterApiView(APIView):
authentication_classes = [TokenAuthentication]
permission_classes = (IsAuthenticated,)
然后我们来在Postman里面测试一下我们的接口http://127.0.0.1:8000/center/data/
,发现返回结果是未授权:
但是,如果想要我们的接口通过Token验证,我们就需要在请求HEADER里面添加一个变量:
Authorization
,他的值是我们刚才的Token。我们这个时候添加了参数再来看一下:
要注意这里
Authorization
的值,是Token
再加一个空格,然后再跟值。
如果我们这个时候,把Authorization
的值修改一下,将最后的c换乘d,看看返回结果:
直接返回的401错误。
关于在视图函数添加权限,我们还可以在Peekpa/settings.py
里面添加下面的内容:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
]
}
不过这么做的话,就是全局设置了验证类和验证权限了。
这样,我们的Token验证逻辑就完全跑通了。接下来,我们就能够通过这种方式来给前后端分离做准备了,即VUE前端的每次请求,都可以携带Token来获取数据。
当然,这里的验证,并不仅仅只是Token这种方式,还有其他很多种,这里皮爷仅仅只是抛砖引玉,为大家打开一个思路。
目前,peekpa.com的代码,我已经在Github和码云上面共享了,每一篇文章都配有源码。接下来的内容,将会是重磅的前后端分离,前端Vue开发,后端Django开发。
技术总结
最后总结一下,
Django REST framework实现Token验证:
- 在
setting.py
文件里面的INSTALLED_APPS
里添加rest_framework.authtoken
; - 加了
INSTALLED_APPS
之后,需要执行python manage.py makemigrations
和python manage.py
; - 修改User模型,在创建用户的时候,通过
Token.objects.create(user=instance)
创建一个和User相关联的Token; - 在需要使用Token验证的视图函数中,添加
authentication_classes
和permission_classes
; - 进阶篇的Django Token验证总结完毕。
获取整套教程源码唯一途径,关注『皮爷撸码』,回复『peekpa.com』
长按下图二维码关注,如文章对你有启发或者能够帮助到你,欢迎点赞,在看,转发三连走一发,这是对我原创内容输出的最大肯定。