zoukankan      html  css  js  c++  java
  • drf之框架基础

    (一)drf基础

    全称:django-rest framework

    接口:什么是接口、restful接口规范(协议)

    CBV(基于FBV的基础上形成)、CBV生命周期源码----基于restful规范下的CBV接口

    请求生命周期:请求组件、解析组件、响应组件

    序列化组件(序列化、反序列化简单来说就是对象转为字符串、字符串转为对象,目的是为传输数据(传给别的语言或者存储))

    三大认证(重中之重):认证(用户是否合法)、权限(管理员、普通用户)、频率(次数过多限制)

    其他组件(过滤、筛选、排序、分页、路由)

    1.接口

    概念:联系两个物质的媒介,完成信息的交互。在web程序中,联系前台页面后台数据库的媒介。

    web接口组成:

    url:长得像返回数据的url链接。如api.baidu.map/search

    www.baidu.com不叫接口,叫url链接,访问只能拿到主页。api.baidu.map/search是接口,返回的是json数据)

    请求参数:前台按照指定的key提供数据给后台。(必须是给定的,这样后台才能以此提取数据再到数据库查询返回)

    响应数据:后台与数据库交互后,将数据反馈给前台。

    因此,接口就是带着请求参数访问能够得到响应数据的url链接。

    接口 = url + 请求参数 + 响应数据

    2.restful接口规范

    接口规范:不同后台语言,使用同样的接口返回同样的数据。

    如何写接口:要写url和响应数据。如果将请求参数也加上,就是在写接口文档。

    两大部分:

    1url

    1)用api关键字标识接口url。方式1api.baidu.com;方式2:www.baudu.com/api

    2)接口数据安全性决定优先选用https协议

    3)如果一个接口有多版本存在,需要在url中标识体现。如下的v1v2

    api.baidu.com/v1/....  api.baidu.com/v2/....

    4)操作中的数据称为资源,在url中资源一般采用复数形式,一个接口可以概括对该资源的多种操作方式。(一个url对应一个类,类里面可以有多个请求方法)

    可以对操作隐藏,并且复用性更强(写动作了,只能适用这一个动作,不写其他动作都可以用)如api.baidu.com/books    api.baidu.com/books/(pk)

    5)请求方式有多种,用一个url处理如何让保证不混乱------通过不同的请求方式标识不同操作资源的方式

    /books      get     获取所有

    /books post   增加一个(多个)

    /books/(pk) delete 删除一个

    /books/(pk)  put 整体更新一个  #改一个用户

    /books/(pk)  patch 局部更新一个 #改一个用户的密码

    6)资源往往涉及数据的各种操作方式:筛选、排序、限制

    api.baidu.com/books/?search=宝马&ordering=-price&limit=3

    2)响应数据

    1http请求的响应会有响应状态码,接口用来返回操作的资源数据,也有自己操作数据结果的资源状态码status 0代表操作资源成功,1代表操作失败,2代表操作成功,但没匹配结果)

    注:资源状态码和http状态码不一样,为前后台的约定

    2)资源状态码的文字提示。

    status ok “账号有误或者密码有误”

    3)资源本身

    results

    :删除资源成功不做任何数据返回(只返回空字符串,连状态码、状态信息都不返回)

    4)不能直接返回的资源(子资源、图片、视频等资源),返回该资源的url链接。

     

    https://api.baidu.com/v1/books?limit=3
    get|post|delete|put|patch   
    {
      “status” : 0,
      “msg” : “ok”,
      “results”: [
    {
      “title”: “三国”,
      “price”: 78,
      “img”: “https://.....”   
        }
      ]
    }

     

    3.django流程

    1)项目准备:

    1.分发路由

    在项目文件夹的urls复制一份到应用文件夹中。然后在项目文件夹的urls分发路由给app:导入include,然后url(r'^api/', include('api.urls'))。再在app文件夹的urls.py中分发路由给CBV

    2.视图

    在应用中分发路由前,先写类视图

    from django.http import JsonResponse
    from django.views import View
    
    class Book(View):
    
        def get(self, request, *args, **kwargs):
            return JsonResponse('get ok', safe=False)
    
        def post(self, request, *args, **kwargs):
            return JsonResponse('get ok', safe=False)   #safe默认为true,要返回字典。不是字典否则抛异常。

    3.在应用urls下分发路由

    from django.conf.urls import url
    from . import views    #注意在应用中导入视图都是.   从当前应用中导入
    
    urlpatterns = [
        url(r'^books/', views.Book.as_view()),
    ]

    4.定义模型类

    1models.py中定义类

    from django.db import models
    
    class Book(models.Model):
    
        title = models.CharField(max_length=64)
        price = models.DecimalField(max_digits=5, decimal_places=2) #整数、小数位
    
        class Meta:    #嵌套类(给上级类添加功能或指定标准)
            
           db_table = 'book'    #自定义数据库表名
            verbose_name = "book"   #给模型起个可读的名字,默认是复数
            verbose_name_plural = verbose_name   #取消上面的复数
    
        def __str__(self):      #显示的内容
            return '<<%s>>' % self.title    

     

       (2)数据库迁移

    进入djangoshell环境中:Tools----> run manage.py task

    shell环境中生成迁移文件:makemigrations。然后迁移:migrate

    5.生成admin

    1)在amin.py中注册并且导入模型

    from django.contrib import admin
    port models
    
    admin.site.register(models.Book)

    2)创建用户

    shell环境中:createsuper创建超级用户,然后输入用户密码(邮箱不用)

     

     

     2CBV的请求生命周期

    请求如何到CBV下的getpost

    a.请求过来,项目文件中路由分发给应用api的路由

    b.应用分发路由走as_view函数。

    views.Book.as_view()  保存一系列数据(requestargs**kwargs等)给Book对象,然后都给dispatch进行路由分发。

    dispatch干的事:判断请求方式是否支持,然后返回(通过getattr)支持的这些请求方法(getpost等,在视图中自定义getpost的返回值)的结果。

    c.通过dispatch就执行了CBV下请求方式的结果,返回结果

     

     

    4.django原生的接口、序列化

      六大基础接口:获取一个、获取所有、增加一个、删除一个、整体更新一个、局部更新一个

     十大接口:6大基础、群增、群删、整体群改、局部群改

     

    1.在应用的urls.py下分发路由

    url(r'^books/$', views.Book.as_view()),   #必须要加$,否则后面匹配不到

    url(r'^books/(?P<pk>.*)/$', views.Book.as_view()),有名分组

    在视图函数中通过kwargs.get(pk)取到匹配的值

    2.views.py里写逻辑

    class Book(View):

        def get(self, request, *args, **kwargs):

            pk = kwargs.get('pk')  #获取参数

            if not pk:  #群查接口

                #操作数据库

                book_obj_list = models.Book.objects.all()

                #序列化过程

                book_list = []

                for obj in book_obj_list:   #将查到的对象序列化

                    dic = {}

                    dic['title'] = obj.title

                    dic['price'] = obj.price

                    book_list.append(dic)

                return JsonResponse({

                    'status' : 0,

                    "msg" : "ok",

                    "results": book_list,

                }, json_dumps_params={'ensure_ascii':False})

            else:    #单查接口

                book_dic = models.Book.objects.filter(pk=pk).values(

                    'title', 'price').first()

                if book_dic:

                    return JsonResponse({

                        'status': 0,

                        "msg": "ok",

                        "results": book_dic,

                    }, json_dumps_params={'ensure_ascii': False})

                return JsonResponse({

                    'status': 2,

                    "msg": "no results",

                }, json_dumps_params={'ensure_ascii': False})

        def post(self, request, *args, **kwargs):

            #前台通过urlencoded方式提交数据

            try:

                book_obj = models.Book.objects.create(**request.POST.dict()) #create创建对象。将request.POST中存放的提交的关键词参数转化为字典以**方式传进去。没传参数,这边会报错。

                if book_obj:

                    return JsonResponse({

                    'status': 0,

                    "msg": "ok",

                    “results”: {‘title’:book_obj.title, “price”:book_obj.price}

                }, json_dumps_params={'ensure_ascii': False})

            except:    #健壮性

                return JsonResponse({

                    'status': 1,

                    "msg": "wrong params",

                }, json_dumps_params={'ensure_ascii': False})

            return JsonResponse({    #可能操作数据库失败了

                    'status': 2,

                    "msg": "created failed",

                }, json_dumps_params={'ensure_ascii': False})

               

      

    JsonResponse返回时,中文会变成unicode,要加json_dumps_params={'ensure_ascii':False}选项。但在linux环境下的火狐浏览器,加了是乱码。

    filter返回queryset对象,对象里是个列表(表名:对象信息(有自定义str就是自定义的信息))。first取里第一个对象(相当于print(第一个对象)values展示对应的对象里的值

    <QuerySet [<Book: <<三国演义>>>]>                   #直接.filter

    <<三国演义>>                                    #.first()

    <QuerySet [{'title': '三国演义', 'price': Decimal('56.00')}]>  #.values('title','price')

    {'title': '三国演义', 'price': Decimal('56.00')}             #.values.first()  是个字典

     上面序列化的工作很麻烦。drf就是为了方便序列化的。

     

    postman可以完成不同方式的请求:getpostput

    postman发送数据包有三种方式:form-dataurlencodedjson. 原生djangourlencoded数据提交兼容。

     

  • 相关阅读:
    初探JavaScript(一)——也谈元素节点、属性节点、文本节点
    解决Myeclipse下Debug出现Source not found以及sql server中导入数据报错
    Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable
    Hadoop阅读笔记(五)——重返Hadoop目录结构
    Hadoop阅读笔记(四)——一幅图看透MapReduce机制
    可视化(番外篇)——在Eclipse RCP中玩转OpenGL
    可视化(番外篇)——SWT总结
    Hadoop阅读笔记(三)——深入MapReduce排序和单表连接
    探秘Tomcat(一)——Myeclipse中导入Tomcat源码
    osgearth将视点绑定到一个节点上
  • 原文地址:https://www.cnblogs.com/yq055783/p/13149575.html
Copyright © 2011-2022 走看看