zoukankan      html  css  js  c++  java
  • 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就不是一个合格的开发!!!!

  • 相关阅读:
    【BZOJ5281】Talent Show(分数规划)
    数据库的连接(学习笔记)
    锁(学习笔记)
    事务处理(学习笔记)
    游标(学习笔记)
    PL/SQL基础-异常处理
    通用函数(学习笔记)
    转换函数(学习笔记)
    数据库的备份和恢复(学习笔记学习中)
    分析函数
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/12094338.html
Copyright © 2011-2022 走看看