Django REST framework 使用简记
最近在参与的项目中需要使用到dajngo REST framework工具包进行开发,之前参与的项目几乎都是清一色的使用原生的django(话说偶尔也会使用一下Flask,真心不怎么喜欢这个框架),之前也有听说过这个工具包是如何的强大,奈何由于太(lan)忙(duo)的原因,一直没有好好去认真学习下,这回也算是临时抱佛脚了.
Django rest framework介绍(纯属从其他博客粘贴复制过来的)
Django REST framework is a powerful and flexible toolkit for building Web APIs.
Some reasons you might want to use REST framework:
- The Web browsable API is a huge usability win for your developers.
- Authentication policies including packages for OAuth1a and OAuth2.
- Serialization that supports both ORM and non-ORM data sources.
- Customizable all the way down - just use regular function-based views if you don't need the more powerful features.
- Extensive documentation, and great community support.
- Used and trusted by internationally recognised companies including Mozilla, Red Hat, Heroku, and Eventbrite.
中文:
Django REST framework 是用于构建Web API 的强大而灵活的工具包。
我们可能想使用REST框架的一些原因:
- Web浏览API对于开发人员来说是一个巨大的可用性。
- 认证策略包括OAuth1a和OAuth2的包。
- 支持ORM和非ORM数据源的序列化。
- 如果你不需要更强大的功能,就可以使用常规的基于功能的视图。
- 广泛的文档和良好的社区支持。
- 包括Mozilla、Red Hat、Heroku和Eventbrite在内的国际知名公司使用和信任。
开发环境配置
- python
- pip install django
- pip install djangorestframework
- pip install markdown
- pip install django-filter
万恶的分割线=====================
学习方案(学习这个工具包的前提是你早已经熟练掌握使用django)
官方文档网址 http://www.django-rest-framework.org/
快速开发官方文档网址 http://www.django-rest-framework.org/tutorial/quickstart/
- 序列化
- 请求与响应
- 基于视图的类
- 授权与权限
- 关系与超链接
- 视图集与路由
一.序列化(序列化,个人理解就是按照开发者的的意愿获取/更新/创建模型字段值并进行序列处理)
django基本的东西不再赘述
示例项目目录基本结构(项目名称:Learning_drf/应用名称:api):
1) 注册应用: 项目以及应用创建完毕后,进行基本的项目配置(路由配置,settings配置),必须将app和rest_framework组件进行应用注册.
2)创建模型,生成迁移文件,执行迁移.
3)在应用目录下创建serializers.py文件,创建方法及功能见下图:
说明:序列化类首先定义了一些需要被序列化/反序列化的字段,你可以根据你的需要去选择处理那些字段的数据, create() 和 update() 方法定义了在调用 该序列化类对象的save()方法时是如何进行创建和修改实例化对象,这里对这两个方法的使用进行简单的说明:
# 视图函数中
from rest_framework.views import APIView # 类视图中使用,集成自该类
from rest_framework.decorators import api_view # 方法视图中使用,是一个装饰器,直接装饰方法视图
from django.contrib.auth.decorators import login_required # 原生django自带的登录验证装饰器
from rest_framework import status
from rest_framework.response import Response # 直接可以将字典数据转换成json数据
from api.models import Snippet
from api.serializers import SnippetSerializer
from rest_framework.request import Request
from rest_framework import exceptions @api_view(['GET', 'POST', 'PUT', 'DELETE']) # 指明允许那些请求方式进行请求
@login_required
def api_list(request):
"""
:param request:
:return: list all snippets or create a new snippet
"""
if request.method == 'GET':
# 向数据库查询数据,得到查询集
try:
query_set = Snippet.objects.all()
except Snippet.DoesNotExist:
return Response(status=status.HTTP_417_EXPECTATION_FAILED)
# 调用序列化类对象,返回进行了序列化的字段集合,使用serializers.data方式 获取数据
serializers = SnippetSerializer(query_set, many=True)
# 取出数据,向客户端进行返回,Response()会将数据转化为json数据.
return Response(serializers.data, status=status.HTTP_200_OK) # 前端提交数据,调用模型,将其保存到数据库中
elif request.method == 'POST':
# 从request对象中取出数据,将其反序列化,返回反序列化的对象
serializer = SnippetSerializer(data= request.data)
# 如果反序列化的对象存在,就说明数据有效,将数据保存到数据库中
if serializer.is_valid():
# 调用save(), 从而调用序列化对象的create()方法,创建一条数据
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) # 修改数据
elif request.method == 'PUT': # 在rest framework 中 request对象是经过封装的
id = request.query_params.get('id')
try:
query_set = Snippet.objects.get(id = id)
except Snippet.DoesNotExist:
return Response(status=status.HTTP_417_EXPECTATION_FAILED)
serializer = SnippetSerializer(query_set,data=request.data) # 如果反序列化对象存在,就调用save()方法,从而调用update()方法 更新数据
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK) elif request.method == 'DELETE':
id = request.query_params.get('id')
try:
query_set = Snippet.objects.get(id=id)
except Snippet.DoesNotExist:
return Response(status=status.HTTP_417_EXPECTATION_FAILED) # 如果需要删除数据,直接调用delete()即可以
query_set.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
<<<<<<<<<<<<<<<<<<<<<<万恶的分割线>>>>>>>>>>>>>>>>>>>>
二.路由,请求与响应
# 请求对象
# REST框架介绍了一个 请求(Request)对象,它扩展了常规的HttpResquest ,
# 并且,提供更灵活的请求解析。请求(Request)对象的核心功能是 request.data属性,
# 这个属性与原生django的request.POST相似,但是它对Web APIs更加有用。
# request.POST 只处理表单数据。只对'POST'方法起作用。
# drf 的 request.data 可以处理任意数据。对'POST','PUT','PATCH'方法起作用。
# 使用 drf 获取GET请求的请求参数方式为 request.query_params 返回字典 # 响应对象
# REST框架也介绍了Response对象,它是一类用未渲染内容和内容协商来决定正确的内容类型并把它返回给客户端的模板响应(TemplateResponse) 。
# return Response(data) 根据客户端的请求来渲染成指定的内容类型 # 状态码
# 总是在你的视图中用数字的HTTP状态码会更加容易理解,并且如果你用其他错误
# 代码表示错误,就不太容易注意到了。REST框架为每个状态码(status code)提供
# 更明确的标识符,例如在状态(status)模型中的 HTTP_400_BAD_REQUEST 就可以表实请求错误 (from rest_framework import status) # 装饰API视图
# REST框架提供两个装饰器,你可以用它们来写API视图。
# @api_view 装饰器用在基于视图的方法上。from rest_framework.decorators import api_view
# APIView 类用在基于视图的类上. from rest_framework.views import APIView
# 路由匹配
# 在匹配到应用的urls.py文件中,匹配方式如下:
from django.contrib import admin
from django.urls import path,include urlpatterns = [
path('admin/', admin.site.urls),
path(r'api-auth/',include('rest_framework.urls', namespace='rest_framework')),
path(r'api/', include('api.urls')), 路由到api 这个 app 的 urls.py
] # 在匹配到视图urls.py中,匹配方式如下:
from django.conf.urls import url
# 用来添加格式后缀模式
from rest_framework.urlpatterns import format_suffix_patterns from api.views import api_list,snippet_detail,UserDetail, UserList urlpatterns = [
url(r'^snippet/$', api_list),
url(r'^snippet/(?P<pk>[0-9]+)/$', snippet_detail),
url(r'users/$', UserList.as_view()),
url(r'users/(?P<pk>[0-9]+)/$', UserDetail.as_view() name="user_data"), 路由到视图中
]
<<<<<<<<<<<<<<<<<<<<<<万恶的分割线>>>>>>>>>>>>>>>>>>>>
三.基于类的视图
from rest_framework.views import APIView # 类视图父类
from rest_framework import status # 状态码
from rest_framework.response import Response # 生成响应对象
from rest_framework import permissions # 进行访问用户的验证 class ViewSet(APIView): # 进行用户有效性验证
# permission_classes = [permissions.IsAuthenticated] # 允许任何用户进行访问该视图的接口,包括匿名用户, 在某些场景中, 必须设置验证用户的方式,否则会抛出异常
permission_classes = [permissions.AllowAny] def get(self, request):
return Response(status=status.HTTP_204_NO_CONTENT) def post(self, request):
return Response(status=status.HTTP_204_NO_CONTENT)
Django REST framework 使用简记的更多相关文章
- 使用django rest framework
django 刚接触,想做一些restful api , google了一下,发现有现成的框架.Django REST framework. 对使用做下记录: 安装 从http://django-re ...
- 利用 Django REST framework 编写 RESTful API
利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framewor ...
- django rest framework 入门
django rest framework 入门1-序列化 Serialization 分类: Python 2013-01-22 22:24 11528人阅读 评论(0) 收藏 举报 djangop ...
- django rest framework
Django-Rest-Framework 教程: 4. 验证和权限 作者: Desmond Chen, 发布日期: 2014-06-01, 修改日期: 2014-06-02 到目前为止, 我们的AP ...
- django rest framework csrf failed csrf token missing or incorrect
django rest framework csrf failed csrf token missing or incorrect REST_FRAMEWORK = { 'DEFAULT_AUTHEN ...
- Django REST Framework学习——Android使用REST方法访问Diango
本文更应该叫做Android如何模拟浏览器访问Django服务器后台. 环境为: Android通过HttpClient访问服务器,从Django中获取json数据,解析显示在UI界面上. 问题为: ...
- 用Django Rest Framework和AngularJS开始你的项目
Reference: http://blog.csdn.net/seele52/article/details/14105445 译序:虽然本文号称是"hello world式的教程&quo ...
- Django REST framework使用ViewSets的自定义路由实现过程
在Django中使用基于类的视图(ClassView),类中所定义的方法名称与Http的请求方法相对应,才能基于路由将请求分发(dispatch)到ClassView中的方法进行处理,而Django ...
- Django REST FrameWork中文教程2:请求和响应
从这一点开始,我们将真正开始覆盖REST框架的核心.我们来介绍几个基本的构建块. 请求对象REST框架引入了Request扩展常规的对象HttpRequest,并提供更灵活的请求解析.Request对 ...
随机推荐
- XGBoost中参数调整的完整指南(包含Python中的代码)
(搬运)XGBoost中参数调整的完整指南(包含Python中的代码) AARSHAY JAIN, 2016年3月1日 介绍 如果事情不适合预测建模,请使用XGboost.XGBoost算法已 ...
- C++ 智能指针 shared_ptr 分析
引文: C++对指针的管理提供了两种解决问题的思路: 1.不允许多个对象管理一个指针 2.允许多个对象管理一个指针,但仅当管理这个指针的最后一个对象析构时才调用delete ps:这两种思路的共同点就 ...
- graph处理工具
仅作为记录笔记,完善中...................... 1 PyGSP https://pygsp.readthedocs.io/en/stable/index.html ht ...
- log4j重复打印的解决方法
log4j的logger(旧版本称logger)是层次结构的,子logger会继承父logger的属性,appender也是可继承的属性,这常常 容易导致配置错误而引起的log4j输出重复的log信息 ...
- Golang 传递任意类型的切片
肯定有这样的一种场景,写一个函数,该函数可以接收任意类型的切片,完成相应的功能. 就好比这种情况 intSlice := []int{1,2,3,4,5,6,7,8} strSlice := []st ...
- Ideaui和WebStrom2019最新版自动生成破解码
http://idea.medeming.com/jet/ 直接点击下载 6ZUMD7WWWU-eyJsaWNlbnNlSWQiOiI2WlVNRDdXV1dVIiwibGljZW5zZWVOYW1l ...
- HTML5 极简的JS函数
页面初始化 mui框架将很多功能配置都集中在mui.init方法中,要使用某项功能,只需要在mui.init方法中完成对应参数配置即可,目前支持在mui.init方法中配置的功能包括:创建子页面.关闭 ...
- java之hibernate之 cascade和inverse
1.Cascade是级联动作,在many_to_one中如果使用cascade可以级联操作关联对象,如下代码可以级联保存Category对象. 在Book的映射文件设置 <many-to-one ...
- Tomcat组件梳理--Server
Tomcat组件梳理--Server 1.Server组件的定义和功能概述 定义: Server组件用于描述一个启动的Tomcat实例,一个Tocmat被启动,在操作系统中占用一个进程号,提供web服 ...
- Python进阶(六)----装饰器
Python进阶(六)----装饰器 一丶开放封闭原则 开放原则: 增加一些额外的新功能 封闭原则: 不改变源码.以及调用方式 二丶初识装饰器 装饰器: 也可称装饰器函数,诠释开放封闭原则 ...