美文网首页用Django开发Peekpa.com
用Django全栈开发(进阶篇)——11. Django RES

用Django全栈开发(进阶篇)——11. Django RES

作者: 皮爷撸码 | 来源:发表于2020-09-15 14:31 被阅读0次

    大家好,这是皮爷给大家带来的最新的学习Python能干啥?之Django教程的进阶版

    很抱歉这篇文章更新的晚了,原因是皮爷这段时间一直在日本换工作,经过一个月的煎熬,最后终于拿到了想要去的公司的offer。以后可以将peekpa.com和工作相结合,创建更加牛逼的peekpa.com 同时为大家制作更加详细的,有内容的教程。

    在之前《用Django全栈开发》系列专辑里面,皮爷详细的阐述了如何编写一个完整的网站,具体效果可以浏览线上网站:Peekpa.com

    从进阶篇开始,每一篇文章都是干货满满,干的不行。这一节,我们来说:如何通过Django REST Framework来实现Token验证。为我们的前后端分离做最后的准备

    Peekpa.com的官方地址:http://peekpa.com

    获取整套教程源码唯一途径,关注『皮爷撸码』,回复『peekpa.com』

    皮爷的每一篇文章,都配置相对应的代码。这篇文章的代码对应的Tag是“Advanced_11”。

    title.jpeg

    背景了解

    我们这里所说的验证,英文实际是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 makemigrationspython manage.py migrate了,执行完成,我们会在数据库中生成Authon Token的表格:

    001
    接下来一步,我们在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/页面,通过超级管理员账号登录进来:

    002

    看到这里有三个内容:Tokens, Users和 Groups。

    我们这里需要使用到的就是Tokens和Users。

    我们可以在回到我们之前写好的Dashboard页面http://127.0.0.1:8000/cms/dashboard/,然后在User里面创建一个新的User:

    003
    004
    我们这里只是为了测试,所以简单一点:账号:pylm@peekpa.com,密码:peekpa。然后点击确定。

    创建好之后,我们再回到我们的Admin页面,来看一下发生了什么。首先进入User页面:

    005
    看到新创建的pylm@peekpa.com是成功创建出来的;接着我们去看一下Token页面: 006
    看到这里,在创建新用户的时候,系统自动生成了一个与之匹配的Token,值为0db104f47f1fec1d4f179a6ca369b691c060848c,并且关联到的User是我们刚刚创建的pylm@peekpa.com用户。

    这里就说明,我们的Token Authentication已经完成了50%了,那么我们接着继续。

    使用Token Authentication

    既然,我们要使用Token验证,首先第一步就是要拿到Token。

    拿到Token有两种方法:

    1. 用Django REST Framework自带的obtain_auth_token方法可以获取;
    2. 就是自己写一个方法,在登录成功的时候,将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请求,需要传入登录账号的参数,即emailpassword这两个。所以我们打开我们的Postman来测试一下:

    007

    看到,方法是POST,路径是http://127.0.0.1:8000/api-token/,传入两个参数emailpassword,返回结果则是我们的Token,就是之前所生成的对应pylm@peekpa.com这个账号的token:0db104f47f1fec1d4f179a6ca369b691c060848c

    这里如果传入的参数不对,则会返回其他错误信息,这个大家可以下去自行试验一下。

    接下来,我们就是要如何使用这个Token了。

    我们的试想,是要通过上一节所讲的数据中心异步请求接口,通过传入参数以及Token,来给我们返回结果。那么我们就这么干。

    如果想要在视图函数里面使用Token的验证,我们需要稍微修改一下视图函数。上节课我们写的API函数是CenterApiView,对应的URL是center/data/,在没有修改之前,我们的接口http://127.0.0.1:8000/center/data/返回结果是这一个样子:

    008
    为了融合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/,发现返回结果是未授权:

    009
    但是,如果想要我们的接口通过Token验证,我们就需要在请求HEADER里面添加一个变量:Authorization,他的值是我们刚才的Token。我们这个时候添加了参数再来看一下: 010
    要注意这里Authorization的值,是Token再加一个空格,然后再跟值。

    如果我们这个时候,把Authorization的值修改一下,将最后的c换乘d,看看返回结果:

    011

    直接返回的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验证:

    1. setting.py文件里面的INSTALLED_APPS里添加rest_framework.authtoken;
    2. 加了INSTALLED_APPS之后,需要执行python manage.py makemigrationspython manage.py
    3. 修改User模型,在创建用户的时候,通过Token.objects.create(user=instance)创建一个和User相关联的Token;
    4. 在需要使用Token验证的视图函数中,添加authentication_classespermission_classes;
    5. 进阶篇的Django Token验证总结完毕。

    获取整套教程源码唯一途径,关注『皮爷撸码』,回复『peekpa.com』

    长按下图二维码关注,如文章对你有启发或者能够帮助到你,欢迎点赞在看转发三连走一发,这是对我原创内容输出的最大肯定。

    相关文章

      网友评论

        本文标题:用Django全栈开发(进阶篇)——11. Django RES

        本文链接:https://www.haomeiwen.com/subject/weacyktx.html