Django之Restful API
理解Restful架构:http://www.ruanyifeng.com/blog/2011/09/restful
RESTful设计指南:http://www.ruanyifeng.com/blog/2014/05/restful_api.html
Django REST framework文档:http://www.django-rest-framework.org/#installation
Django RESTful 中文翻译:http://blog.csdn.net/ppppfly/article/category/6170709
基于Django的RESTful安装
第一步:使用pip安装:
pip install djangorestframework
第二步:添加rest_framework
到settings中的INSTALLED_APPS
中:
INSTALLED_APPS = ( ... 'rest_framework', )
如果你需要使用浏览器API,需要添加REST framework的登录注销模块,需要将下面的代码添加到urls.py中:
urlpatterns = [
...
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
注意:URL路径可以任意编写,但你必须include 'rest_framework.urls'
,且使用'rest_framework'
这个namespace(命名空间)。如果你的Django是1.9+版本,你也可以不写namespace
,REST framework会帮你自动设置。
例子
让我们看一个简单用例:如何用REST framework 来搭建一个简单的支持modle的API。
我们将创建一个读/写API,来处理我们项目中的用户信息。
任何REST framework的全局设置,都存放在一个配置字典(dictionary,有些语言如Java中的map)中,名为REST_FRAMEWORK
。我们从以下的操作开始,把下面的内容添加到你的settings.py模块中:
REST_FRAMEWORK = {
# 使用Django的标准`django.contrib.auth`权限管理类,
# 或者为尚未认证的用户,赋予只读权限.
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
]
}
别忘了,确保你已经将 rest_framework 添加到你的INSTALLED_APPS中。
现在我们已做好准备,来创建我们的API了。这是我们的项目根下urls.py模块:
from django.conf.urls import url, include
from django.contrib.auth.models import User
from rest_framework import routers, serializers, viewsets
# Serializers定义了API的表现形式.
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'is_staff')
# ViewSets 定义了 视图(view) 的行为.
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
# Routers 提供了一种简单途径,自动地配置了URL。
router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
# 使用自动的URL路由,让我们的API跑起来。
# 此外,我们也包括了登入可视化API的URLs。
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
现在你可以在浏览器的http://127.0.0.1:8000/里,打开你新建的’users’ API了。使用右上角的登陆控制,可以对系统用户进行新增和删除操作
rest_searializer.py:
from django.conf.urls import url, include
#从已存在的assets项目中导入数据models模块
from assets import models
from rest_framework import routers,serializers,viewsets
#定义一个表现形式
class UserSerializer(serializers.ModelSeriallizer):
class Meta:
model = models.UserProfile
fields = ('username','name','token','email','is_staff')
class AssetSerializer(serializers.ModelSerializer):
class Meta:
model = models.Asset
...
from rest_framework import viewsets
from assets import models
from assets import rest_searializer
class UserViewSet(viewsets.ModelViewSet):
queryset = models.UserProfile.objects.all()
serializer_class = rest_searializer.UserSerializer
class AssetViewSet(viewsets.ModelViewSet):
queryset = models.Asset.objects.all()
serializer_class = rest_searializer.AssetSerializer
rest_urls.py:
from rest_framework import routers
from django.conf.urls import url,include
from assets import rest_viewset
router = routers.DefaultRouter()
router.register(r'users',rest_viewset.UserViewSet)
router.register(r'assets',rest_viewset.AssetViewSet)
router.register(r'manufactory',rest_viewset.ManufactoryViewSet)
router.register(r'business_unit',rest_viewset.BusinessUnitViewSet)
urlpatterns = [
url(r'',include(router.urls)),
url(r'^api-auth',include('rest_framework.urls',namespace='rest_framework'))
]
settings.py:
REST_FRAMEWORK = {
# 使用Django的标准`django.contrib.auth`权限管理类,
# 或者为尚未认证的用户,赋予只读权限.
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
]
}
使用API插入数据的例子,views.py中:
def api_test(request):
if request.method =="GET":
return render(request,"test_post.html")
else:
data = json.loads(request.POST.get("data"))
print("--->",data)
rest_obj = rest_searializer.AssetSerializer(data=data,many=True)
if rest_obj.is_valid():
rest_obj.save()
return render(request,"test_post.html",{"errors":rest_obj.errors,"data":rest_obj.data})
其中many=true
,是将queryset多对多序列化,详细参数后面会有表述.
dss.Serializer 提供序列器
function serializer(data, datetime_format='timestamp', output_type='raw', include_attr=None, except_attr=None, foreign=False, many=False)
Parameters:
data(Required|(QuerySet, Page, list, django model object))-待处理数据
datetime_format(Optional|string)-如果包含 datetime 将 datetime 转换成相应格式.默认为 "timestamp"(时间戳)
output_type(Optional|string)-serialize type. 默认“ raw ”原始数据,即返回 list 或 dict
include_attr(Optional|(list, tuple))-只序列化 include_attr 列表里的字段。默认为 None
exclude_attr(Optional|(list, tuple))-不序列化 except_attr 列表里的字段。默认为 None
foreign(Optional|bool)-是否序列化 ForeignKeyField 。 include_attr 与 exclude_attr 对 ForeignKeyField 依旧有效。 默认为 False
many(Optional|bool)-是否序列化 ManyToManyField 。 include_attr 与 exclude_attr 对 ManyToManyField 依旧有效 默认为 False
Django之Restful API的更多相关文章
- Django编写RESTful API(一):序列化
欢迎访问我的个人网站:www.comingnext.cn 关于RESTful API 现在,在开发的过程中,我们经常会听到前后端分离这个技术名词,顾名思义,就是前台的开发和后台的开发分离开.这个技术方 ...
- Django编写RESTful API(四):认证和权限
欢迎访问我的个人网站:www.comingnext.cn 前言: 按照前面几篇文章里那样做,使用Django编写RESTful API的基本功能已经像模像样了.我们可以通过不同的URL访问到不同的资源 ...
- python 全栈开发,Day95(RESTful API介绍,基于Django实现RESTful API,DRF 序列化)
昨日内容回顾 1. rest framework serializer(序列化)的简单使用 QuerySet([ obj, obj, obj]) --> JSON格式数据 0. 安装和导入: p ...
- Django编写RESTful API(二):请求和响应
欢迎访问我的个人网站:www.comingnext.cn 前言 在上一篇文章,已经实现了访问指定URL就返回了指定的数据,这也体现了RESTful API的一个理念,每一个URL代表着一个资源.当然我 ...
- 利用Django实现RESTful API(一)
RESTful API现在很流行,这里是它的介绍 理解RESTful架构和 RESTful API设计指南.按照Django的常规方法当然也可以实现REST,但有一种更快捷.强大的方法,那就是 Dja ...
- 使用Django创建RESTful API
Agenda 1.What is an api Api refers to application programming interface It is a set of subroutine de ...
- Django编写RESTful API(五):添加超链接提高模型间的关联性
前言 在第四篇中,加入了用户模型,以及相关的认证和权限的功能.但是我们在使用的时候,会发现在访问http://127.0.0.1:8000/users/时看到的用户列表,不能够直接点击某个链接然后查看 ...
- Django编写RESTful API(六):ViewSets和Routers
欢迎访问我的个人网站:www.comingnext.cn 前言 在本系列的文章中,我在第一篇和第二篇文章中写的编写Django视图时,使用的都是基于函数的方法,并且每个视图函数之前都会加一个djang ...
- Python用Django写restful api接口
用Python如何写一个接口呢,首先得要有数据,可以用我们在网站上爬的数据,在上一篇文章中写了如何用Python爬虫,有兴趣的可以看看: https://www.cnblogs.com/sixrain ...
随机推荐
- RocketMQ部分消息消费不到的问题
在企业项目中,利用RocketMQ接收数据,存库. 由于是第一次在项目中具体的使用RocketMQ,一直采坑. 1.发现问题:在最终的联调过程中,并发压测,订单数据丢失,同一时刻,oms推送900+的 ...
- 卡林巴琴谱&简谱
---------------------------------------------------------------------------------------------------- ...
- printf的使用和test的使用
1.printf的使用 printf的转义序列 序列 说明 \a 警告字符,通常为ASCII的BEL字符 \b 后退 \c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字 ...
- StringSequences
题意: 给出两个长度不超过\(50\)的字符串\(S, T\),每次可以在\(S\)中插入一个字符,把每次操作后的\(S\)写成一个序列,问有多少种不同的序列. 注意到我们可以把\(S\)拆分成一段一 ...
- P1902 刺杀大使
题目描述 伊朗伊斯兰革命卫队(某恐怖组织)正在策划一起刺杀行动,他们的目标是沙特驻美大 使朱拜尔.他们来到了沙特驻美使馆,准备完成此次刺杀,要进入使馆首先必须通过使馆前 的防御迷阵. 迷阵由 n*m ...
- realloc()函数
原型:extern void *realloc(void *mem_address, unsigned int newsize); 参数: mem_address: 要改变内存大小的指针名 newsi ...
- vue-d2admin前端axio异步请求详情
vue-d2admin前端axio异步请求详情 d2admin>src>api>sys.login.js 设计axio api import request from '@/plug ...
- ZR#1012
## ZR#1012 blog咕咕咕了好久,开始补. 解法: 一个很显然的性质, $ x $ 只能转移到 $ x+1 $ 或者 $ 2x $ 处,所以我们可以以此性质建图,即 $ x $ 向 $ x ...
- redis渐进式 rehash
转载(http://redisbook.com/preview/dict/incremental_rehashing.html) 上一节说过, 扩展或收缩哈希表需要将 ht[0] 里面的所有键值对 r ...
- etcd,flannel,docker relationship---and k8s
journalctl -xe voidcn.com/article/p-qufvdmpq-bqn.html etcd more etcd.confETCD_NAME=default ETCD_DATA ...