理解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安装:

  1. pip install djangorestframework

第二步:添加rest_framework到settings中的INSTALLED_APPS中:

  1. INSTALLED_APPS = ( ... 'rest_framework', )

如果你需要使用浏览器API,需要添加REST framework的登录注销模块,需要将下面的代码添加到urls.py中:

  1. urlpatterns = [
  2. ...
  3. url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
  4. ]

注意: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模块中:

  1. REST_FRAMEWORK = {
  2. # 使用Django的标准`django.contrib.auth`权限管理类,
  3. # 或者为尚未认证的用户,赋予只读权限.
  4. 'DEFAULT_PERMISSION_CLASSES': [
  5. 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
  6. ]
  7. }

别忘了,确保你已经将 rest_framework 添加到你的INSTALLED_APPS中。

现在我们已做好准备,来创建我们的API了。这是我们的项目根下urls.py模块:

  1. from django.conf.urls import url, include
  2. from django.contrib.auth.models import User
  3. from rest_framework import routers, serializers, viewsets
  4. # Serializers定义了API的表现形式.
  5. class UserSerializer(serializers.HyperlinkedModelSerializer):
  6. class Meta:
  7. model = User
  8. fields = ('url', 'username', 'email', 'is_staff')
  9. # ViewSets 定义了 视图(view) 的行为.
  10. class UserViewSet(viewsets.ModelViewSet):
  11. queryset = User.objects.all()
  12. serializer_class = UserSerializer
  13. # Routers 提供了一种简单途径,自动地配置了URL。
  14. router = routers.DefaultRouter()
  15. router.register(r'users', UserViewSet)
  16. # 使用自动的URL路由,让我们的API跑起来。
  17. # 此外,我们也包括了登入可视化API的URLs。
  18. urlpatterns = [
  19. url(r'^', include(router.urls)),
  20. url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
  21. ]

现在你可以在浏览器的http://127.0.0.1:8000/里,打开你新建的’users’ API了。使用右上角的登陆控制,可以对系统用户进行新增和删除操作

rest_searializer.py:

  1. from django.conf.urls import url, include
  2. #从已存在的assets项目中导入数据models模块
  3. from assets import models
  4. from rest_framework import routers,serializers,viewsets
  5. #定义一个表现形式
  6. class UserSerializer(serializers.ModelSeriallizer):
  7. class Meta:
  8. model = models.UserProfile
  9. fields = ('username','name','token','email','is_staff')
  10. class AssetSerializer(serializers.ModelSerializer):
  11. class Meta:
  12. model = models.Asset
  13. ...
  1. from rest_framework import viewsets
  2. from assets import models
  3. from assets import rest_searializer
  4. class UserViewSet(viewsets.ModelViewSet):
  5. queryset = models.UserProfile.objects.all()
  6. serializer_class = rest_searializer.UserSerializer
  7. class AssetViewSet(viewsets.ModelViewSet):
  8. queryset = models.Asset.objects.all()
  9. serializer_class = rest_searializer.AssetSerializer

rest_urls.py:

  1. from rest_framework import routers
  2. from django.conf.urls import url,include
  3. from assets import rest_viewset
  4. router = routers.DefaultRouter()
  5. router.register(r'users',rest_viewset.UserViewSet)
  6. router.register(r'assets',rest_viewset.AssetViewSet)
  7. router.register(r'manufactory',rest_viewset.ManufactoryViewSet)
  8. router.register(r'business_unit',rest_viewset.BusinessUnitViewSet)
  9. urlpatterns = [
  10. url(r'',include(router.urls)),
  11. url(r'^api-auth',include('rest_framework.urls',namespace='rest_framework'))
  12. ]

settings.py:

  1. REST_FRAMEWORK = {
  2. # 使用Django的标准`django.contrib.auth`权限管理类,
  3. # 或者为尚未认证的用户,赋予只读权限.
  4. 'DEFAULT_PERMISSION_CLASSES': [
  5. 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
  6. ]
  7. }

使用API插入数据的例子,views.py中:

  1. def api_test(request):
  2. if request.method =="GET":
  3. return render(request,"test_post.html")
  4. else:
  5. data = json.loads(request.POST.get("data"))
  6. print("--->",data)
  7. rest_obj = rest_searializer.AssetSerializer(data=data,many=True)
  8. if rest_obj.is_valid():
  9. rest_obj.save()
  10. 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:

  1. data(Required|(QuerySet, Page, list, django model object))-待处理数据
  2. datetime_format(Optional|string)-如果包含 datetime datetime 转换成相应格式.默认为 "timestamp"(时间戳)
  3. output_type(Optional|string)-serialize type. 默认“ raw ”原始数据,即返回 list dict
  4. include_attr(Optional|(list, tuple))-只序列化 include_attr 列表里的字段。默认为 None
  5. exclude_attr(Optional|(list, tuple))-不序列化 except_attr 列表里的字段。默认为 None
  6. foreign(Optional|bool)-是否序列化 ForeignKeyField include_attr exclude_attr ForeignKeyField 依旧有效。 默认为 False
  7. many(Optional|bool)-是否序列化 ManyToManyField include_attr exclude_attr ManyToManyField 依旧有效 默认为 False

Django之Restful API的更多相关文章

  1. Django编写RESTful API(一):序列化

    欢迎访问我的个人网站:www.comingnext.cn 关于RESTful API 现在,在开发的过程中,我们经常会听到前后端分离这个技术名词,顾名思义,就是前台的开发和后台的开发分离开.这个技术方 ...

  2. Django编写RESTful API(四):认证和权限

    欢迎访问我的个人网站:www.comingnext.cn 前言: 按照前面几篇文章里那样做,使用Django编写RESTful API的基本功能已经像模像样了.我们可以通过不同的URL访问到不同的资源 ...

  3. python 全栈开发,Day95(RESTful API介绍,基于Django实现RESTful API,DRF 序列化)

    昨日内容回顾 1. rest framework serializer(序列化)的简单使用 QuerySet([ obj, obj, obj]) --> JSON格式数据 0. 安装和导入: p ...

  4. Django编写RESTful API(二):请求和响应

    欢迎访问我的个人网站:www.comingnext.cn 前言 在上一篇文章,已经实现了访问指定URL就返回了指定的数据,这也体现了RESTful API的一个理念,每一个URL代表着一个资源.当然我 ...

  5. 利用Django实现RESTful API(一)

    RESTful API现在很流行,这里是它的介绍 理解RESTful架构和 RESTful API设计指南.按照Django的常规方法当然也可以实现REST,但有一种更快捷.强大的方法,那就是 Dja ...

  6. 使用Django创建RESTful API

    Agenda 1.What is an api Api refers to application programming interface It is a set of subroutine de ...

  7. Django编写RESTful API(五):添加超链接提高模型间的关联性

    前言 在第四篇中,加入了用户模型,以及相关的认证和权限的功能.但是我们在使用的时候,会发现在访问http://127.0.0.1:8000/users/时看到的用户列表,不能够直接点击某个链接然后查看 ...

  8. Django编写RESTful API(六):ViewSets和Routers

    欢迎访问我的个人网站:www.comingnext.cn 前言 在本系列的文章中,我在第一篇和第二篇文章中写的编写Django视图时,使用的都是基于函数的方法,并且每个视图函数之前都会加一个djang ...

  9. Python用Django写restful api接口

    用Python如何写一个接口呢,首先得要有数据,可以用我们在网站上爬的数据,在上一篇文章中写了如何用Python爬虫,有兴趣的可以看看: https://www.cnblogs.com/sixrain ...

随机推荐

  1. C++面向程序设计(第二版)课后习题答案解析

    最近没什么心情整理零散的知识点,就整理一下第四章的课后习题答案. 1.定义一个复数类Complex,重载运算符“+”,使之能用于复数的加法运算.将运算符函数重载为非成员函数,非友元的普通函数.编程序, ...

  2. [Svelte 3] Use await block to wait for a promise and handle loading state in Svelte 3

    Most web applications have to deal with asynchronous data at some point. Svelte 3 apps are no differ ...

  3. GBDT 算法

    GBDT (Gradient Boosting Decision Tree) 梯度提升迭代决策树.GBDT 也是 Boosting 算法的一种,但是和 AdaBoost 算法不同(AdaBoost 算 ...

  4. nginx优化、负载均衡、rewrite

    nginx优化 # 普通用户启动 (useradd nginx -s /sbin/nologin -M) user nginx; # 配置nginx worker进程个数 #worker_proces ...

  5. java大文件分块上传断点续传demo

    第一点:Java代码实现文件上传 FormFile file = manform.getFile(); String newfileName = null; String newpathname =  ...

  6. qDeleteAll与clear

    qDeleteAll:专门用于指针容器,对容器或者迭代器中的每个对象进行delete操作,而不是从容器中移除对象.源代码如下: void qDeleteAll(ForwardIterator begi ...

  7. 数码管一些列功能的verilog实现

    将数码管各段发光元件的正极连在一起称为共阳数码管,且该共点击链接电路电源的正极,而各段的负极连接驱动电路.它适用于低电平有效的驱动电路,当某段的驱动电平为低电平时,该段发亮:将数码管各段发光元件的负极 ...

  8. 网路流 uoj 168 元旦老人与丛林

    http://uoj.ac/problem/168 没想到是网络流 官方题解地址 http://jiry-2.blog.uoj.ac/blog/1115 subtask2告诉我们度数为012的点对答案 ...

  9. MySQL 常用字段类型与对应的Java类型

    varchar 不定长字符串 字符串或是没有合适类型时,可以选择它作为字段类型 对应Java中的String int bigint 数值 一般以int作为数字的默认选择,数值很大时使用bigint 对 ...

  10. Python中_,__,__xx__方法区别

    _xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. 方法就是以单下 ...