Django-restframework框架01

前后台交互

前台部分:

首先先在终端下载axios插件,插件被下载到node_modules文件夹内了,这样全局都能导出axios插件;以后只要有使用axios插件都要重新安装到当前项目内:

​ cnmp install axios

// main.js
import axios from 'axios'
Vue.prototype.$axios = axios;
<!--home.vue-->
<template>
  <div class="home">
    <h1>主页面</h1>
  </div>
</template>

<script>
export default {
  name: 'home',
  components: {
  },
  created() {
      this.$axios({
          url:'http://127.0.0.1:8000/test/',
          method:'post',
          params:{  // 拼接参数在后台的request.GET中
              a:1,
          },
          data:{   // 数据包参数,在后台的request.body中
              x:10,
          },
          headers:{  // 再后台的META大字典中,
              authorization:'abc.def.xyz',

              token:1,
              zhang:2,
              // 后台:request.META.get('HTTP_参数名全大写')
          }
      }).then(respose=>{
          console.log('成功:',respose.data)  // then和error是后台的响应
      }).catch(error=>{
          console.log('失败:',error.respose.data)
      })
  }
}
</script>

后台部分:

# settings.py 配置
INSTALLED_APPS = [
           'corsheaders',
        ]
MIDDLEWARE = [
      # 'django.middleware.csrf.CsrfViewMiddleware', # 注销掉
    'corsheaders.middleware.CorsMiddleware'  # 注册cors
]

# 打开跨域
CORS_ORIGIN_ALLOW_ALL = True
# 自己定义请求头,不适用系统的了,但要加上系统自带的
CORS_ALLOW_HEADERS = [
    # 系统的
    "accept",
    "accept-encoding",
    "authorization",
    "content-type",
    "dnt",
    "origin",
    "user-agent",
    "x-csrftoken",
    "x-requested-with",
    # 自己定义的
    "token",
    "zhang",
]
#urls.py
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^test/$', views.test),
]
from django.http import JsonResponse

# Create your views here.


def test(request):
    import json
    print(request.method)
    print(request.GET)  # <QueryDict: {'a': ['1']}>
    res=json.loads(request.body)  # {'x': 10}
    print(res)

    print(request.META.get('HTTP_AUTHORIZATION'))  # abc.def.xyz
    return (JsonResponse('ok',safe=False))

前台headers内数据传到后台request.META中,META还携带有其他的参数,参看下图:

drf(Django-restframework)框架安装

1) drf 是Django的插件,所以要提前安装Django;
2)安装命令:pip install restframework;
3) 使用drf时,要在settings注册; import rest_framework

接口

通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介

Web API接口和一般的url链接还是有区别的,Web API接口简单概括有下面四大特点

  • url:长得像返回数据的url链接
  • 请求方式:get、post、put、patch、delete
    • 采用get方式请求上方接口
  • 请求参数:json或xml格式的key-value类型数据
    • ak:6E823f587c95f0148c19993539b99295
    • region:上海
    • query:肯德基
    • output:json
  • 响应结果:json或xml格式的数据
    • 上方请求参数的output参数值决定了响应数据的格式
什么是接口?===>url链接
    采用某种请求方式提交参数,获得响应的响应数据结果的url链接
    https://www.baidu.com  # 网址
     https://www.baidu.com/search
     四部分:url链接+请求方式+请求参数+相应数据{
    "status":0,
    "message":"ok",
    "results":[
        {
            "name":"肯德基(罗餐厅)",
            "location":{
                "lat":31.415354,
                "lng":121.357339
            },
            "address":"月罗路2380号",
            "province":"上海市",
            "city":"上海市",
            "area":"宝山区",
            "street_id":"339ed41ae1d6dc320a5cb37c",
            "telephone":"(021)56761006",
            "detail":1,
            "uid":"339ed41ae1d6dc320a5cb37c"
        }
        ...
        ]
}

yapi编写接口文档

'''
一个开源可视化接口管理平台,YApi项目可以搭建在任何本地或云服务器上,完成后台项目开发时的接口编写。为开发。测试等人员提供可视化的接口预览
'''

从这里进去:yapi测试网站

个人账户:zhangchao 密码:与相关一致

用上面数据写出的一个小示例:

接口测试工具:Postman

这里下载:点击进入下载

下载完毕,在双击安装的时候遇到了一个错误,如下:

需要网上下载一个系统配置:

解决办法:

1.安装系统更新补丁KB2533623,下载地址:

安装之后双击电脑会自动更新配置,之后再重新启动电脑即可。

postman测试后台数据的界面解释:

restful接口规范

点击这里看重点:restful更多规范

url链接:
    1)接口都是操作前后台数据的,所以需要保证数据的安全性的
        采用https协议
     2)接口用来操作数据,与网址(操作页面)有区别,所以用特定的关键字表示接口;
        API关键字
            -https://api.baidu.com
             -https://www.baidu/api
     3) 接口操作的数据称之为 资源,在url中只体现资源 名称(空间),不体现操作资源的方式动词常规接口:
        - https://api.baidu.com/books/
         - https://api.baidu.com/books/(pk)/
        非常规接口 :和某资源不是特别密切或者不是一种资源
            - https://api.baidu.com/login/
             - https://api.baidu.com/place/search/
     4)如果一个资源存在多版本结果,在url链接中要用特定符号来兼容多版本共存;
        v1|v2
        - https://api.baidu.com/v1/books/
         - https://api.baidu.com/v2/books/
     5) 群资源操作,一般还有额外的限制条件,如排序、限制调试、分页等等;
            ?限制条件
                - https://api.baidu.com/v1/books/?ordering=-price&limit=3
     6) 五大请求方式:
        get:获取单个或多个资源
            - https://api.baidu.com/books/ ==>群查,返回多个结果对象
            - https://api.baidu.com/books/(pk)/ ==>单查,返回单个结果对象
         post:新增单个或多个资源
            - https://api.baidu.com/books/
                单增:提交单个数据字典,完成单增,返回单个结果对象
                群增:提供多个数据字典的数组,完成群增,返回多个结果对象
         put:整体修改单个或多个资源
            - https://api.baidu.com/books/(pk)/
                整体修改单个,提供单个数据字典(主键在url中体现),完成单改,返回单个结果对象
         patch:局部修改单个或多个资源
            方式与put完全相同,不同的是:操作的资源如果有5个key-value键值对,put请求提供的字典必须全包含,但是patch提供的字典包含的键值对0-5都可以
         delete:删除单个或多个资源
            -https://api.baidu.com/books/
                多删:提供多个资源主键数据,完成群删,不做任何资源返回(一般我们会返回结果信息:成功|失败)
                单删:不需要提供额外数据,完成单删,不做任何资源返回(一般我们会返回结果信息:成功|失败)
         
响应结果:
7)响应对象中要包含网络状态码(网络状态信息和网络状态码捆绑出现,不要额外设置):
    1xx:基本信息
    2xx:成功 - 200 基本 201新增成功
    3xx:重定向
    4xx:客户端错误 - 400错误请求;403请求无权限;404请求资源不存在;
    5xx:服务端错误 - 500服务器错误
    
8) 数据状态码(一般都是前后台约定规则)
    0:成功
    1:失败 - 1xx:具体失败信息(要再接口文档中明确写出)
    2:无数据 -2xx:具体无数据信息(要在接口文档中明确写出)
9)数据状态信息(一般不仅仅是对数据状态码的解释,更是对结果的描述,给前台开发者阅读的)
10)数据结果(常量、数组、字典),如果有子资源(图片、音频、视频),返回资源的url链接;
'''
{
    "status":0,
    "msg":'ok',
    "results":[{
        "name":"西游记",
        "img":"https://api.baidu.com/media/book/xyj.png"
        }]
    }
'''    

基于restful规范书写的十大常用接口

一个视图类可以包括五个常规请求方法:get|post|put|patch|delete
五个请求方法处理十个资源操作的逻辑:单群查|单群增|单群整体改|单群局部改|单群删
# d_proj(app)>urls.py
# 总路由路由分发
from django.conf.urls import url,include
from app import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/',include('api.urls')),
]

# api(app)>urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^books/$', views.BookView.as_view()),
    url(r'^books/(?P<pk>\d+)/$', views.BookView.as_view()),
]



#api(app)views.py
from django.http import JsonResponse
from django.views import View
from . import models

class BookView(View):
    def _single_get(self, pk):
        book_dic = models.Book.objects.filter(pk=pk).values('name', 'price').first()
        if not book_dic:
            return JsonResponse({
                'status': 1,
                'msg': '单查 资源不存在',
            })
        return JsonResponse({
            'status': 0,
            'msg': '单查 ok',
            'results': book_dic
        })
    def _many_get(self):
        book_query = models.Book.objects.values('name', 'price')
        book_list = list(book_query)
        return JsonResponse({
            'status': 0,
            'msg': '群查 ok',
            'results': book_list
        })

    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if pk:  # 单查
            return self._single_get(pk)
        else:  # 群查
            return self._many_get()

    def post(self, request, *args, **kwargs):
        return JsonResponse({
            'status': 0,
            'msg': 'post ok'
        })

    def put(self, request, *args, **kwargs):
        return JsonResponse({
            'status': 0,
            'msg': 'put ok'
        })

    def patch(self, request, *args, **kwargs):
        return JsonResponse({
            'status': 0,
            'msg': 'patch ok'
        })

    def delete(self, request, *args, **kwargs):
        return JsonResponse({
            'status': 0,
            'msg': 'delete ok'
        })

debug使用说明

不会使用debug就不是一个合格的开发!!!!

猜你喜欢

转载自www.cnblogs.com/zhangchaocoming/p/12094338.html