restful-framwork续集2

1.版本控制

1.1版本控制是做什么用的, 我们为什么要用

首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~

随着我们项目的更新~版本就越来越多~~我们不可能新的版本出了~以前旧的版本就不进行维护了~~~

那我们就需要对版本进行控制~~这个DRF也给我们提供了一些封装好的版本控制方法~~

1.2版本控制怎么用

之前我们学视图的时候知道APIView,也知道APIView返回View中的view函数,然后调用的dispatch方法~

那我们现在看下APIView.dispatch方法~~看下它都做了什么~~

执行self.initial方法之前是各种赋值,包括request的重新封装赋值,下面是路由的分发,那我们看下initial这个方法都做了什么~~

我们可以看到,我们的version版本信息赋值给了 request.version  版本控制方案赋值给了 request.versioning_scheme~~

其实这个版本控制方案~就是我们配置的版本控制的类~~

也就是说,APIView通过这个方法初始化自己提供的组件~~

我们接下来看看框架提供了哪些版本的控制方法~~在rest_framework.versioning里~~

1.3版本控制的使用

我滴个神,试了其他的试了一个多小时,怎么弄都不行,我也是没招了!!稍后处理!!
错在了一个小点,我滴神,django2.0中是re_path=url,我用了path....
没看到那个警告信息。。55555555555555555555555555

1.3.1QueryParameterVersioning

settings.py

REST_FRAMEWORK = {
    # 默认使用的版本控制类
    ‘DEFAULT_VERSIONING_CLASS‘: ‘rest_framework.versioning.QueryParameterVersioning‘,
    # 允许的版本
    ‘ALLOWED_VERSIONS‘: [‘v1‘, ‘v2‘],
    # 版本使用的参数名称
    ‘VERSION_PARAM‘: ‘version‘,
    # 默认使用的版本
    ‘DEFAULT_VERSION‘: ‘v1‘,
}
views.py

class DemoView(APIView):
    def get(self, request):
        print("request.version", request.version)
        print("request.versioning_scheme", request.versioning_scheme)
        # 得到版本号  根据版本号的不同返回不同的信息
        if request.version == "v1":
            return Response("v1版本的数据")
        elif request.version == "v2":
            return Response("v2版本的数据")
        return Response("不存在的版本")
urls.py

urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    path(r"demo", DemoView.as_view()),
]

1.3.2URLPathVersioning

settings.py

REST_FRAMEWORK = {
    # 默认使用的版本控制类
    ‘DEFAULT_VERSIONING_CLASS‘: ‘rest_framework.versioning.URLPathVersioning‘,
    # 允许的版本
    ‘ALLOWED_VERSIONS‘: [‘v1‘, ‘v2‘],
    # 版本使用的参数名称
    ‘VERSION_PARAM‘: ‘version‘,
    # 默认使用的版本
    ‘DEFAULT_VERSION‘: ‘v1‘,
}
urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    re_path(r‘api/(?P<version>(v1|v2))/demo/‘, DemoView.as_view(), name=‘demo‘),
]
views.py

class DemoView(APIView):
    def get(self, request, *args, **kwargs):
        print("request.version", request.version)
        print("request.versioning_scheme", request.versioning_scheme)
        # 得到版本号  根据版本号的不同返回不同的信息
        if request.version == "v1":
            return Response("v1版本的数据")
        elif request.version == "v2":
            return Response("v2版本的数据")
        return Response("不存在的版本")

其他的参考源代码就可以了,一定注意这个re_path,带有正则匹配时,使用的是re_path!!!

1.3.3自定义版本类

utils.py

# by gaoxin
from rest_framework import versioning

class MyVersion(object):
    def determine_version(self, request, *args, **kwargs):
        # 返回值 给了request.version
        # 返回版本号
        # 版本号携带在过滤条件 xxxx?version=v1
        version = request.query_params.get("version", "v1")

        return version
settings.py

REST_FRAMEWORK = {
    # 默认使用的版本控制类
    ‘DEFAULT_VERSIONING_CLASS‘: ‘utils.version.MyVersion‘,

}
views.py

class DemoView(APIView):
    def get(self, request, *args, **kwargs):
        print("request.version", request.version)
        print("request.versioning_scheme", request.versioning_scheme)
        # 得到版本号  根据版本号的不同返回不同的信息
        if request.version == "v1":
            return Response("v1版本的数据")
        elif request.version == "v2":
            return Response("v2版本的数据")
        return Response("不存在的版本")

2.认证

2.1认证作用

我们都知道~我们可以在网站上登录~然后可以有个人中心,对自己信息就行修改~~~
但是我们每次给服务器发请求,由于Http的无状态,导致我们每次都是新的请求~~
那么服务端需要对每次来的请求进行认证,看用户是否登录,以及登录用户是谁~~
那么我们服务器对每个请求进行认证的时候,不可能在每个视图函数中都写认证~~~

一定是把认证逻辑抽离出来~~以前我们可能会加装饰器~或者中间件~~那我们看看DRF框架给我们提供了什么~~~

2.2认证流程



我们这个权限组件返回的是request.user,那我们这里的request是新的还是旧的呢~~

我们的initial是在我们request重新赋值之后的~所以这里的request是新的~也就是Request类实例对象~~

那这个user一定是一个静态方法~我们进去看看~~

2.3认证试验

models.py

class User(models.Model):

    username = models.CharField(max_length=32)
    pwd = models.CharField(max_length=16)
    token = models.UUIDField()
views.py 

from django.shortcuts import render
import uuid
from app.models import User
from utils.auth import MyAuth
# Create your views here.

from rest_framework.views import APIView
from rest_framework.response import Response

class DemoView(APIView):
    def get(self, request):
        return Response("认证demo~")

class LoginView(APIView):

    def post(self, request):
        username = request.data.get("username")
        pwd = request.data.get("pwd")
        # 登录成功 生成token 会把token给你返回
        token = uuid.uuid4()
        User.objects.create(username=username, pwd=pwd, token=token)
        return Response("创建用户成功")

class TestView(APIView):
#配置局部认证
    authentication_classes = [MyAuth,]

    def get(self, request):
        print(request.user)  # User object (1)
        print(request.auth)  # a890ec1e18c146f2b8542eb465bd6774
        user_id = request.user.id
        return Response("认证测试")
urls.py

from django.contrib import admin
from django.urls import path,include,re_path
from app.views import DemoView,LoginView, TestView
from rest_framework.routers import DefaultRouter
import rest_framework.versioning

router = DefaultRouter()

urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    re_path(r‘api/demo/‘, DemoView.as_view(), name=‘demo‘),
re_path(r"login", LoginView.as_view()),
    re_path(r"test", TestView.as_view()),
]
utils/auth.py

# by gaoxin
from rest_framework.exceptions import AuthenticationFailed
from app.models import User
from rest_framework.authentication import BaseAuthentication

class MyAuth(BaseAuthentication):

    def authenticate(self, request):
        # 做认证 看他是否登录
        # 从url过滤条件里拿到token
        # 去数据库看token是否合法
        # 合法的token能够获取用户信息
        token = request.query_params.get("token", "")
        if not token:
            raise AuthenticationFailed("没有携带token")
        user_obj = User.objects.filter(token=token).first()
        if not user_obj:
            raise AuthenticationFailed("token不合法")
        # return (None, None)
        return (user_obj, token)



2.4配置全局认证

配置在settings.py中

REST_FRAMEWORK = {
    # 默认使用的版本控制类
    ‘DEFAULT_VERSIONING_CLASS‘: ‘utils.version.MyVersion‘,
    "DEFAULT_AUTHENTICATION_CLASSES": ["utils.auth.MyAuth", ]

}

原文地址:https://blog.51cto.com/10983441/2435216

时间: 2024-10-08 19:36:20

restful-framwork续集2的相关文章

通过beego快速创建一个Restful风格API项目及API文档自动化(转)

通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界面. 一.创建数据库及数据表(MySQL) #db--jeedev -- ---------------------------- -- Table structure for `app` -- ---------------------------- DROP TABLE IF EXISTS `a

利用 Django REST framework 编写 RESTful API

利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framework 真乃一大神器,可以轻易的甚至自动化的搞定很多事情,比如: 自动生成符合 RESTful 规范的 API 支持 OPTION.HEAD.POST.GET.PATCH.PUT.DELETE 根据 Content-Type 来动态的返回数据类型(如 text.json) 生成 browserable

Yii2框架RESTful API教程(二) - 格式化响应,授权认证和速率限制

之前写过一篇Yii2框架RESTful API教程(一) - 快速入门,今天接着来探究一下Yii2 RESTful的格式化响应,授权认证和速率限制三个部分 一.目录结构 先列出需要改动的文件.目录如下: web ├─ common │ └─ models │ └ User.php └─ frontend ├─ config │ └ main.php └─ controllers └ BookController.php 二.格式化响应 Yii2 RESTful支持JSON和XML格式,如果想指定

在GlassFish应用服务器上创建并运行你的第一个Restful Web Service【翻译】

前言 本人一直开发Android应用,目前Android就业形势恶劣,甚至会一路下滑,因此决定学习服务器开发.采用的语言是java,IDE是Intellij,在下载Intellij的同时看到官网很多优秀的guide文章,于是按照guide成功完成了一个RESTful的demo.官方文档非常简洁,给我带来了很大的帮助,于是翻译之,希望对其他不愿意看原文的人有所帮助.由于水平有限,读者发现错误请指正,谢谢. 原文地址: https://www.jetbrains.com/help/idea/2016

RESTful风格的Web服务框架:Swagger

Swagger与SpringMVC项目整合 为了方便的管理项目中API接口,在网上找了好多关于API接口管理的资料,感觉目前最流行的莫过于Swagger了,功能强大,UI界面漂亮,并且支持在线测试等等,所以本人仔细研究了下Swagger的使用,下面就如何将Swagger与个人的SpringMVC项目进行整合做详细说明: 最终API管理界面:  详细步骤: Step1:项目中引入相关jar包: <properties> <project.build.sourceEncoding>UT

RESTful最佳实践

哲学 不要为了RESTful而RESTful 在能表达清楚的情况下,简单就是美 接口路径设计 接口设计原则 URI指向的是唯一的资源对象 示例: 指向ID为yanbo.ai的Account对象 GET http://~/$version/accounts/yanbo.ai URI可以隐式指向唯一的集合列表 示例: 隐式地指向trades list 集合 GET http://~/$version/trades/(list)等同于GET http://~/$version/trades 聚合资源必

flask开发restful api

在此之前,向大家说明的是,我们整个框架用的是flask + sqlalchemy + redis.如果没有开发过web,还是先去学习一下,这边只是介绍如果从开发web转换到开发移动端.如果flask还不是很熟悉,我建议先到这个网站简单学习一下,非常非常简单.http://dormousehole.readthedocs.org/en/latest/ 一直想写一些特别的东西,能让大家学习讨论的东西.但目前网上的很多博客,老么就按照官方文档照本宣读,要么直接搬代码,什么都不说明.我写这个系列的博客,

搭建基于spring MVC框架 + RESTful架构风格技术总结

实战篇: 在SpringMVC框架中搭建RESTful架构风格来完成客户端与服务器端的低耦合度.可扩展性.高并发与大数据流量的访问. 用RESTful架构的创建步骤: 1.创建一个全新的Web工程 2.导包,导入所需要的所有第三方jar包.(springMVC+Hibernate的基本包是必须的) 3.作配置,针对不同的项目需求和不同的搭建设计,开发人员可以按照自己的编码风格来设计符合项目开发具体 应该用多少篇配置文件.但是这几篇配置文件是必不可少的: 3-1.web.xml配置文件:最基本的配

CXF+Spring+JAXB+Json构建Restful服务

话不多说,先看具体的例子: 文件目录结构: web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://

Wcf体现Restful风格

Wcf体现Restful风格 概述 含状态传输(Representational State Transfer)的软件架构风格.主要特点 1.  资源是由URI来指定: 例如http://example.com/resources/ 2.  对资源的操作 包括获取.创建.修改和删除资源,这些操作正好对应HTTP协议提供的GET.POST.PUT和DELETE方法 3.  传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML ,YAML 等. 下面通过一个简单的例子逐个问题解决