联博开奖网:drf之框架基础

admin/2020-06-17/ 分类:科技/阅读:

(一)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数据提交兼容。

 

,

Allbet手机版下载

欢迎进入Allbet手机版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

TAG:
阅读:
广告 330*360
广告 330*360
Sunbet_进入申博sunbet官网
微信二维码扫一扫
关注微信公众号
新闻自媒体 Copyright © 2002-2019 Sunbet 版权所有
二维码
意见反馈 二维码