Django——REST framework
1. 什么是REST
- REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”
- REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态
- 所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性
- 对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)
设计参考:http://www.ruanyifeng.com/blog/2014/05/restful_api.html
2. 目前如何实现 REST API ?
按照规则,根据不同的请求方式做出不同的处理,并且返回内容以及相应状态码
3. 什么是 Django REST framework?
Django REST framework是一个基于Django开发的app,用于快速搭建REST API。
安装:
pip3 install djangorestframework
a. 快速使用
from rest_framework import routers
from . import views router = routers.DefaultRouter()
router.register(r'users', views.UserInfoViewSet) urlpatterns = [
url(r'^', include(router.urls)),
]
2. 注册路由
from rest_framework import viewsets
from . import models
from . import serializers # ########### 1. 基本处理方式 ########### class UserInfoViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = models.UserInfo.objects.all().order_by('-id')
serializer_class = serializers.UserInfoSerializer
3. 编写ViewSet,视图函数
from rest_framework import serializers
from . import models class UserInfoSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.UserInfo
# fields = ('id', 'username', 'pwd','ug') # fields = '__all__'
exclude = ('ug',)
depth = 1 # 0<=depth<=10
4. 编写serializers,form验证以及数据库操作
PS:最终访问路径
[GET] http://127.0.0.1:8000/api/users/
[POST] http://127.0.0.1:8000/api/users/
[GET] http://127.0.0.1:8000/api/users/7/
[PUT] http://127.0.0.1:8000/api/users/7/
[DELETE] http://127.0.0.1:8000/api/users/7/
b. 基于CBV
from django.conf.urls import url,include
from django.contrib import admin
from . import views urlpatterns = [
url(r'^users/$', views.UserList.as_view()),
url(r'^users/(?P<pk>[0-9]+)/$', views.UserDetail.as_view()),
]
1. URL
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.request import Request
from rest_framework.parsers import JSONParser
from . import models
from . import serializers class UserList(APIView):
def get(self, request, *args, **kwargs):
user_list = models.UserInfo.objects.all()
serializer = serializers.MySerializer(instance=user_list, many=True)
return Response(serializer.data) def post(self, request, *args, **kwargs):
data = JSONParser().parse(request)
serializer = serializers.MySerializer(data=data)
if serializer.is_valid():
# print(serializer.data)
# print(serializer.errors)
# print(serializer.validated_data)
# 如果有instance,则执行update方法;否则,执行create
serializer.save()
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400) class UserDetail(APIView):
def get(self, request, *args, **kwargs):
obj = models.UserInfo.objects.filter(pk=kwargs.get('pk')).first()
serializer = serializers.MySerializer(obj)
return Response(serializer.data) def delete(self, request, *args, **kwargs):
obj = models.UserInfo.objects.filter(pk=kwargs.get('pk')).first()
obj.delete()
return Response(status=204) def put(self, request, *args, **kwargs):
data = JSONParser().parse(request)
obj = models.UserInfo.objects.filter(pk=kwargs.get('pk')).first()
serializer = serializers.MySerializer(obj, data=data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=400)
2. 编写视图函数
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from . import models class MySerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
username = serializers.CharField(required=False, allow_blank=True, max_length=100)
pwd = serializers.CharField() def validate_username(self, value):
if value == '中国':
raise ValidationError('用户名中存在敏感字符')
return value def validate_pwd(self, value):
print(value)
return value def validate(self, attrs):
print(attrs)
return attrs def create(self, validated_data):
"""
当执行save方法时,自动调用。instance未传值
:param validated_data:
:return:
"""
print(validated_data)
return models.UserInfo.objects.create(**validated_data) def update(self, instance, validated_data):
"""
当执行save方法时,自动调用。instance传值
:param instance:
:param validated_data:
:return:
"""
instance.username = validated_data.get('username', instance.username)
instance.save()
return instance
3. 编写serializer
c. 基于FBV
from django.conf.urls import url,include
from django.contrib import admin
from . import views urlpatterns = [
url(r'^users/$', views.user_list),
url(r'^users/(?P<pk>[0-9]+)/$', views.user_detail),
]
1. URL
from django.http import JsonResponse,HttpResponse
from rest_framework.response import Response
from rest_framework.parsers import JSONParser
from rest_framework.decorators import api_view
from .serializers import MySerializer
from . import models @api_view(['GET',"POST"])
def user_list(request):
"""
List all code snippets, or create a new snippet.
"""
if request.method == 'GET':
user_list = models.UserInfo.objects.all()
serializer = MySerializer(user_list,many=True)
return Response(serializer.data) elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = MySerializer(data=data)
if serializer.is_valid():
print(serializer.data)
print(serializer.errors)
print(serializer.validated_data)
# 如果有instance,则执行update方法;否则,执行create
serializer.save()
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400) @api_view(['GET',"POST","PUT"])
def user_detail(request, pk):
"""
Retrieve, update or delete a code snippet.
""" obj = models.UserInfo.objects.filter(pk=pk).first()
if not obj:
return HttpResponse(status=404) if request.method == 'GET':
serializer = MySerializer(obj)
# return JsonResponse(serializer.data,json_dumps_params={'ensure_ascii':False},content_type='application/json;charset=utf-8')
return Response(serializer.data) elif request.method == 'PUT':
data = JSONParser().parse(request)
serializer = MySerializer(obj, data=data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=400) elif request.method == 'DELETE':
obj.delete()
return Response(status=204)
2. 视图函数
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from . import models class MySerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
username = serializers.CharField(required=False, allow_blank=True, max_length=100)
pwd = serializers.CharField() def validate_username(self, value):
if value == '中国':
raise ValidationError('用户名中存在敏感字符')
return value def validate_pwd(self, value):
print(value)
return value def validate(self, attrs):
print(attrs)
return attrs def create(self, validated_data):
"""
当执行save方法时,自动调用。instance未传值
:param validated_data:
:return:
"""
print(validated_data)
return models.UserInfo.objects.create(**validated_data) def update(self, instance, validated_data):
"""
当执行save方法时,自动调用。instance传值
:param instance:
:param validated_data:
:return:
"""
instance.username = validated_data.get('username', instance.username)
instance.save()
return instance
3. 编写serializer
d. 权限控制
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'permissi.MyPermission',
]
}
1. settings配置文件
class MyPermission(object):
"""
A base class from which all permission classes should inherit.
""" def has_permission(self, request, view):
"""
Return `True` if permission is granted, `False` otherwise.
""" return True def has_object_permission(self, request, view, obj):
return True
2. 权限控制
转载自银角大王:
Django REST framework
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对 ...
- Django REST framework 中文教程1:序列化
建立环境 在我们做任何事情之前,我们将使用virtualenv创建一个新的虚拟环境.这将确保我们的包配置与我们正在开展的任何其他项目保持良好的隔离. virtualenv envsource env/ ...
随机推荐
- mongodb主从备份 和 手动主从切换
环境: 主机A:172.16.160.91 主机B:172.16.160.92 配置主机A [root@master zhxf]# cat docker-compose.yml version: '3 ...
- 常用DOS命令和Linux命令
DOS命令 1.查询端口占用情况:netstat -aon |findstr "8080"; 查看端口进程号: 2.查看进程号信息: tasklist |findstr &qu ...
- Spark累加器
spark累计器 因为task的执行是在多个Executor中执行,所以会出现计算总量的时候,每个Executor只会计算部分数据,不能全局计算. 累计器是可以实现在全局中进行累加计数. 注意: 累加 ...
- [ZJOI2019]语言[树链的并、线段树合并]
题意 题目链接 分析 考虑枚举每个点的答案,最后除以 2 即可. 可以与 \(u\) 构成合法点对 的集合 为所有经过了 \(u\) 的链的并.因为这些链两两有交,根据结论 "树上两条相交的 ...
- Q239 滑动窗口最大值
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位. 返回滑动窗口最大值. 示例: 输入: nums ...
- Mac OS 10.12使用U盘重装(转)
OS X Capitan和macOS Sierra的安装方式和下载系统的方法都是一致的,下面是OS X Capitan的安装方法: 一.准备工作: 准备一个8GB或者8G以上容量的U盘 确保里面的数据 ...
- C#中复制数组
string array = new string[]{"abc", "bcd", "efg"}; string bArray = new ...
- 迁移SharePoint搜索服务至新的服务器
转自:http://blog.fpweb.net/move-sharepoint-2013-search-components-to-new-server/#.V_w4JZH_6uh In this ...
- Java测试各种数据库连接(用Connection类)
源代码: package cn.finedo.fdcollect_service.util; import java.sql.Connection; import org.apache.logging ...
- 超赞的 Go 语言 INI 文件操作
灵活的数据源 不光光可以从文件读取配置,还支持 []byte 类型的纯数据读取和基于 io.ReadCloser 的流式读取. 多种格式兼容 各种文件种类的广泛支持,包括但不限于 my.cnf..gi ...