zoukankan      html  css  js  c++  java
  • rest_framework-00-规范-APIview源码解析-认证

    rest_framework-00-规范-APIview源码解析-认证

    规范

    支付宝:

    接口开发

    订单api----order

    方式1:缺点:如果有10张表,则需要40个url.

    urls.py

    views.py

    缺点:如果有10张表,则需要40个url.    接下来就出现了resrful 规范,比较简洁

    方式2:resrful 规范(建议)  url简洁了,只有一条。

    1. 根据method不同做不同的操作,示例:基于FBV:

     urls.py

    views.py

    2. 根据method不同做不同的操作,示例:基于CBV:

     urls.py:

    views.py:

     

    settings.py

    运行结果:

    代码:

            a. 接口开发
                
                urlpatterns = [
                    # url(r'^admin/', admin.site.urls),
                    url(r'^get_order/', views.get_order),
                    url(r'^add_order/', views.add_order),
                    url(r'^del_order/', views.del_order),
                    url(r'^update_order/', views.update_order),
                ]
                
                    
                def get_order(request):
                    return HttpResponse('')
    
    
                def add_order(request):
                    return HttpResponse('')
    
    
                def del_order(request):
                    return HttpResponse('')
    
    
                def update_order(request):
                    return HttpResponse('')
                    
            b. restful 规范(建议)
                
                1. 根据method不同做不同的操作,示例:
                
                    基于FBV:
                        urlpatterns = [
                            url(r'^order/', views.order),
                        ]
    
                        def order(request):
                            if request.method == 'GET':
                                return HttpResponse('获取订单')
                            elif request.method == 'POST':
                                return HttpResponse('创建订单')
                            elif request.method == 'PUT':
                                return HttpResponse('更新订单')
                            elif request.method == 'DELETE':
                                return HttpResponse('删除订单')
                    基于CBV:
                        urlpatterns = [
                            url(r'^order/', views.OrderView.as_view()),
                        ]
                
                        class OrderView(View):
                            def get(self,request,*args,**kwargs):
                                return HttpResponse('获取订单')
    
                            def post(self,request,*args,**kwargs):
                                return HttpResponse('创建订单')
    
                            def put(self,request,*args,**kwargs):
                                return HttpResponse('更新订单')
    
                            def delete(self,request,*args,**kwargs):
                                return HttpResponse('删除订单')
    
                
    api接口方式

    2.django rest framework规范有哪些?

    10个规则:

    1.https 、2.域名、3.版本、4.名词、method请求方式、过滤条件、状态码、错误值、返回结果、Hypermedia API链接
    注意:推荐使用CBV

    • API与用户的通信协议,总是使用HTTPs协议
    • 域名 
      • https://api.example.com                         尽量将API部署在专用域名(会存在跨域问题)
      • https://example.org/api/                        API很简单
    • 版本
      • URL,如:https://api.example.com/v1/
      • 请求头                                                  跨域时,引发发送多次请求
    • 路径,视网络上任何东西都是资源,均使用名词表示(可复数)
      • https://api.example.com/v1/zoos
      • https://api.example.com/v1/animals
      • https://api.example.com/v1/employees
    • method
      • GET      :从服务器取出资源(一项或多项)
      • POST    :在服务器新建一个资源
      • PUT      :在服务器更新资源(客户端提供改变后的完整资源)
      • PATCH  :在服务器更新资源(客户端提供改变的属性)
      • DELETE :从服务器删除资源
    • 过滤,通过在url上传参的形式传递搜索条件
      • https://api.example.com/v1/zoos?limit=10:指定返回记录的数量
      • https://api.example.com/v1/zoos?offset=10:指定返回记录的开始位置
      • https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数
      • https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
      • https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件
    • 状态码
    200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
    201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
    202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
    204 NO CONTENT - [DELETE]:用户删除数据成功。
    400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
    401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
    403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
    404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
    406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
    410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
    422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
    500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
    
    更多看这里:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
    

      

    def get(self,request,*args,**kwargs):
    ret = {
    'code':1000,
    'msg':'xxx'
    }
    # return HttpResponse(json.dumps(ret))
    return HttpResponse(json.dumps(ret), status=201)

    • 错误处理,状态码是4xx时,应返回错误信息,error当做key。
    {
        error: "Invalid API key"
    }
    
    • 返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。
    GET /collection:返回资源对象的列表(数组)
    GET /collection/resource:返回单个资源对象
    POST /collection:返回新生成的资源对象
    PUT /collection/resource:返回完整的资源对象
    PATCH /collection/resource:返回完整的资源对象
    DELETE /collection/resource:返回一个空文档
    • Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
    {"link": {
      "rel":   "collection https://www.example.com/zoos",
      "href":  "https://api.example.com/zoos",
      "title": "List of zoos",
      "type":  "application/vnd.yourformat+json"
    }}
    

     

    django rest framework框架 

    1.django rest framework框架的下载:
    pip3 install djangorestframework

     

    3.引出rest_framework

    urls.py

    views.py

     

    2.APIview

     

    APIView源码:

    1.APIView继承了View

    原生view

     2、APIView类里面有dispatch方法

    3、 APIView在原有的基础上,多了很多功能。request:进行了加工,是一个新的对象。

    4.请求封装request = self.initialize_request(request, *args, **kwargs)(版本、认证、权限、节流、解析器)

    5.认证

    6.如果自己写了用户认证,就找自己的认证方法:

    7.加注释、initial

    8.initial

    9.认证   

    10.request是封装后的对象了,所有user应该去APIView里面找。

    11._authenticate  # 循环认证类的所有对象 [BasicAuthentication对象,]

     .authenticate方法检查你是否已登入。如果用户没有登入则报错。

    12.接下来自己定义一个认证方法:必须有authenticate方法:如果用户没有登入,则报错。

    运行结果:url没有传token值,则认证失败

    url传了token,认证成功

    13.认证流程加注释  

    0.url.as_view  -》 1.self.dispatch   

    self.dispatch

     2.initial(版本、认证、权限、节流、解析器)

     

    3.perform_authentication 实现认证

    4. from rest_framework.request import Request  方便查询user

    5.获取认证对象,进行一步步的认证

     

     认证流程:view -> dispach -> 封装Request -> initial:(版本、认证、权限、节流、解析器)-> perform_authentication 实现认证 -user -> authenticate方法

    如果认证成功有(token值),request.user则有值。

    认证代码:

            a. 认证 
                - 仅使用:
                        from django.views import View
                        from rest_framework.views import APIView
                        from rest_framework.authentication import BasicAuthentication
                        from rest_framework import exceptions
                        from rest_framework.request import Request
    
                        class MyAuthentication(object):
                            def authenticate(self,request):
                                token = request._request.GET.get('token')
                                # 获取用户名和密码,去数据校验
                                if not token:
                                    raise exceptions.AuthenticationFailed('用户认证失败')
                                return ("alex",None)
    
                            def authenticate_header(self,val):
                                pass
    
                        class DogView(APIView):
                            authentication_classes = [MyAuthentication,]
    
                            def get(self,request,*args,**kwargs):
                                print(request)
                                print(request.user)
                                ret  = {
                                    'code':1000,
                                    'msg':'xxx'
                                }
                                return HttpResponse(json.dumps(ret),status=201)
    
                            def post(self,request,*args,**kwargs):
                                return HttpResponse('创建Dog')
    
                            def put(self,request,*args,**kwargs):
                                return HttpResponse('更新Dog')
    
                            def delete(self,request,*args,**kwargs):
                                return HttpResponse('删除Dog')
     
  • 相关阅读:
    “无法更新EntitySet“*****”,因为它有一个DefiningQuery,而元素中没有支持当前操作的元素”问题的解决方法
    Web.Config全攻略
    C#常用的正则
    Asp.Net MVC2 Json
    webservice+Jquery返回Json格式【原创】
    JAVA线程池介绍以及简单实例
    从程序员到项目经理(17):你不是一个人在战斗思维一换天地宽
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    多表对应更新(跨服务器).sql
    sql导出excel.sql
  • 原文地址:https://www.cnblogs.com/yimiflh/p/9281172.html
Copyright © 2011-2022 走看看