Django-Rest framework基本流程

一、Django rest framework框架安装:

pip3 install djangorestframework -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com

二、Restful framework 
是一个框架,主要实现前后端分离,提供接口API, 对API做一些规范,中文名: 表征状态转移

三、 RESTful API设计规范

- URL
	https://example.org/api/   	 API很简单
	https://api.example.com      尽量将API部署在专用域名(会存在跨域问题)。跨域时,引发发送多次请求
		解决跨域问题:    
			1.header("Access-Control-Allow-Origin:http://www.xxx.com")  //这里即指定http://www.xxx.com 这个域可以请求它;
			2.header("Access-Control-Allow-Origin:*")     //这里即所有域都可以请求它;
- url名词
	https://api.example.com/v1/zoos
	因为是资源,最好起一个英文名词 zooms、animals、employees等
- 版本
	https://api.example.com/v1/zoos?limit=10
		如果有版本最好可以显示在url
			v1 可以代表第一版
- 提交方式
	GET      :从服务器取出资源(一项或多项)
	POST     :在服务器新建一个资源
	PUT      :在服务器更新资源(客户端提供改变后的完整资源)
	PATCH    :在服务器更新资源(客户端提供改变的属性)
	DELETE   :从服务器删除资源
- status
	状态码
		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


- 错误详细
	错误处理,状态码是4xx时,应返回错误信息,error当做key。
	例如:
		{
		    error: "Invalid API key",
		}

- Hypermedia link
	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生命周期:

    前端发送请求-->Django的wsgi-->中间件-->路由系统-->视图-->ORM数据库操作-->模板-->返回数据给用户

rest framework生命周期:

    前端发送请求-->Django的wsgi-->中间件-->路由系统_执行CBV的as_view(),就是执行内部的dispath方法-->在执行dispath之前,有版本分析 和 渲染器-->在dispath内,对request封装-->版本-->认证-->权限-->限流-->视图-->如果视图用到缓存( request.data or   request.query_params )就用到了 解析器-->视图处理数据,用到了序列化(对数据进行序列化或验证) -->视图返回数据可以用到分页


in url.py
	from django.conf.urls import url, include
	from web.views.s1_api import TestView

	urlpatterns = [
	url(r'^test/', TestView.as_view()),
	]

in views.py

	from rest_framework.views import APIView
	from rest_framework.response import Response
	 
	 
	class TestView(APIView):
	    def dispatch(self, request, *args, **kwargs):
	        """
	        请求到来之后,都要执行dispatch方法,dispatch方法根据请求方式不同触发 get/post/put等方法
	         
	        注意:APIView中的dispatch方法有好多好多的功能
	        """
	        return super().dispatch(request, *args, **kwargs)
	 
	    def get(self, request, *args, **kwargs):
	        return Response('GET请求,响应内容')
	 
	    def post(self, request, *args, **kwargs):
	        return Response('POST请求,响应内容')
	 
	    def put(self, request, *args, **kwargs):
	        return Response('PUT请求,响应内容')

	    def options(self, request, *args, **kwargs): 
	    	# 复杂请求 例如post请求 
	    		# 1、先发options请求,服务端进行预检(不带数据)
	    		# 2、通过后,在发送post请求 (带数据)

	    	#最好交给中间件来设置这些
	    	response['Access-Control-Allow-Origin'] = "*" # 解决CORS同源策略方式之一
	        response['Access-Control-Allow-Headers'] = 'content-type' # 尽量不要写 * ,请求头有多少这里就写多少,逗号分隔
	        response['Access-Control-Allow-Methods'] = '*' # 判断可以通过的请求方式 

	    	
	        return Response('PUT请求,响应内容')

如果想要对全局进行配置,则需要再配置文件中写入即可

in settings.py

REST_FRAMEWORK = {
        'UNAUTHENTICATED_USER': None, #默认user
        'UNAUTHENTICATED_TOKEN': None, # 默认auth
        #认证
        # "DEFAULT_AUTHENTICATION_CLASSES": [
        #     "app01.views.MyAuthentication",
        # ],
        #权限
        # "DEFAULT_PERMISSION_CLASSES": [
        #     "app01.utils.TestPermission",
        #     ],
        #限流
        'DEFAULT_THROTTLE_RATES':{
            'myscope_anon':'5/minute', 
            'myscope_user':'10/minute',
        },
        #版本
        'DEFAULT_VERSION':'v1',
        'ALLOWED_VERSIONS':'[v1,v2]',
        'VERSION_PARAM':'version',
        # 'DEFAULT_VERSIONING_CLASS':"rest_framework.versioning.QueryParameterVersioning",
        # 'DEFAULT_VERSIONING_CLASS':"rest_framework.versioning.URLPathVersioning",

        #解析器 parser
        'DEFAULT_PARSER_CLASSES':[
            'rest_framework.parsers.JSONParser',
            'rest_framework.parsers.FormParser',
        ],
        #每页默认显示几条数据
        'PAGE_SIZE':1,

    }


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值