RESTful API现在很流行,这里是它的介绍 理解RESTful架构RESTful API设计指南.按照Django的常规方法当然也可以实现REST,但有一种更快捷、强大的方法,那就是 Django REST framework.它是python的一个模块,通过在Django里面配置就可以把app的models中的各个表实现RESTful API。下面是实现方法:

一、安装配置

  1. pip install djangorestframework
  2. pip install markdown # Markdown support for the browsable API.
  3. pip install django-filter # Filtering support

再到Django的 settings.py 中的INSTALLED_APPS添加 rest_framework,如下:

1
2
3
4
INSTALLED_APPS = (
    ...
    'rest_framework',
)

在根目录的 url.py 文件中为rest_framework框架的 login 和 logout 视图添加url:

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

二、创建model和Serializer

创建app,名为 snippets.。在视图 models.py 中添加一张表如下:

  1. from django.db import models
  2. from pygments.lexers import get_all_lexers # 一个实现代码高亮的模块
  3. from pygments.styles import get_all_styles
  4.  
  5. LEXERS = [item for item in get_all_lexers() if item[1]]
  6. LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS]) # 得到所有编程语言的选项
  7. STYLE_CHOICES = sorted((item, item) for item in get_all_styles()) # 列出所有配色风格
  8.  
  9. class Snippet(models.Model):
  10. created = models.DateTimeField(auto_now_add=True)
  11. title = models.CharField(max_length=100, blank=True, default='')
  12. code = models.TextField()
  13. linenos = models.BooleanField(default=False)
  14. language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
  15. style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)
  16.  
  17. class Meta:
  18. ordering = ('created',)

然后开始同步到数据库中:

  1. ./manage.py makemigrations snippets
  2. ./manage.py migrate

接下来需要做的就是创建 Serializer 类,类似于 Form。它的作用就是从你传入的参数中提取出你需要的数据,并把它转化为 json 格式(注意,已经是字节码了),同时支持反序列化到model对象。在 snippets 文件夹中添加 serializers.py 并在其添加如下:

  1. from rest_framework import serializers
  2. from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES
  3.  
  4. class SnippetSerializer(serializers.Serializer): # 它序列化的方式很类似于Django的forms
  5. id = serializers.IntegerField(read_only=True)
  6. title = serializers.CharField(required=False, allow_blank=True, max_length=100)
  7. code = serializers.CharField(style={'base_template': 'textarea.html'}) # style的设置等同于Django的widget=widgets.Textarea
  8. linenos = serializers.BooleanField(required=False) # 用于对浏览器的上的显示
  9. language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
  10. style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')
  11.  
  12. def create(self, validated_data):
  13. """
  14. Create and return a new `Snippet` instance, given the validated data.
  15. """
  16. return Snippet.objects.create(**validated_data)
  17.  
  18. def update(self, instance, validated_data):
  19. """
  20. Update and return an existing `Snippet` instance, given the validated data.
  21. """
  22. instance.title = validated_data.get('title', instance.title)
  23. instance.code = validated_data.get('code', instance.code)
  24. instance.linenos = validated_data.get('linenos', instance.linenos)
  25. instance.language = validated_data.get('language', instance.language)
  26. instance.style = validated_data.get('style', instance.style)
  27. instance.save()
  28. return instance

三、使用Serializer

先使用 ./manage.py shell 进入Django的shell中。操作如下:

可以看到 Serializer 的使用如同 Django 的 forms.它的反序列化如下:

  1. from django.utils.six import BytesIO
  2.  
  3. stream = BytesIO(content)
  4. data = JSONParser().parse(stream)

这是再把得到的数据转化为实例:

  1. serializer = SnippetSerializer(data=data)
  2. serializer.is_valid() # 开始验证
  3. # True
  4. serializer.validated_data
  5. # OrderedDict([('title', ''), ('code', 'print "hello, world"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')])
  6. serializer.save()
  7. # <Snippet: Snippet object>

同时,我们还可以对 querysets 进行序列化,只需简单地在设置参数 many=True,如下:

  1. serializer = SnippetSerializer(Snippet.objects.all(), many=True)
  2. serializer.data
  3. # [OrderedDict([('id', 1), ('title', u''), ('code', u'foo = "bar"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('id', 2), ('title', u''), ('code', u'print "hello, world"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('id', 3), ('title', u''), ('code', u'print "hello, world"'), ('linenos', False), ('language', 'python'), ('style', 'friendly')])

四、使用 ModelSerializer

ModelSerializer类似于Django的 modelform, 可以直接关联到models中的表。如下:

  1. class SnippetSerializer(serializers.ModelSerializer):
  2. class Meta:
  3. model = Snippet
  4. fields = ('id', 'title', 'code', 'linenos', 'language', 'style')

五、在Django的视图中使用Serializer

首先,可以像常规Django视图的写法一样写,返回序列化的输出数据。

  1. from django.http import HttpResponse, JsonResponse
  2. from django.views.decorators.csrf import csrf_exempt
  3. from rest_framework.renderers import JSONRenderer
  4. from rest_framework.parsers import JSONParser
  5. from snippets.models import Snippet
  6. from snippets.serializers import SnippetSerializer
  7.  
  8. @csrf_exempt
  9. def snippet_list(request):
  10. """
  11. List all code snippets, or create a new snippet.
  12. """
  13. if request.method == 'GET':
  14. snippets = Snippet.objects.all()
  15. serializer = SnippetSerializer(snippets, many=True)
  16. return JsonResponse(serializer.data, safe=False)
  17.  
  18. elif request.method == 'POST':
  19. data = JSONParser().parse(request)
  20. serializer = SnippetSerializer(data=data)
  21. if serializer.is_valid():
  22. serializer.save()
  23. return JsonResponse(serializer.data, status=201)
  24. return JsonResponse(serializer.errors, status=400)

也可以写一个视图对应其models中的表,实现对它的删、改、查。

  1. @csrf_exempt
  2. def snippet_detail(request, pk):
  3. """
  4. Retrieve, update or delete a code snippet.
  5. """
  6. try:
  7. snippet = Snippet.objects.get(pk=pk)
  8. except Snippet.DoesNotExist:
  9. return HttpResponse(status=404)
  10.  
  11. if request.method == 'GET':
  12. serializer = SnippetSerializer(snippet)
  13. return JsonResponse(serializer.data)
  14.  
  15. elif request.method == 'PUT':
  16. data = JSONParser().parse(request)
  17. serializer = SnippetSerializer(snippet, data=data)
  18. if serializer.is_valid():
  19. serializer.save()
  20. return JsonResponse(serializer.data)
  21. return JsonResponse(serializer.errors, status=400)
  22.  
  23. elif request.method == 'DELETE':
  24. snippet.delete()
  25. return HttpResponse(status=204)

添加对应的url, snippets/urls.py 中设置如下:

  1. from django.conf.urls import url
  2. from snippets import views
  3.  
  4. urlpatterns = [
  5. url(r'^snippets/$', views.snippet_list),
  6. url(r'^snippets/(?P<pk>[0-9]+)/$', views.snippet_detail),
  7. ]

最后还要在根目录的 url.py 中添加对应的映射。

  1. urlpatterns = [  
      ...
  2. url(r'^', include('snippets.urls')),
  3. ]

这时,所有的配置已经完成了。接下来就是测试我们的API

六、测试API

为了方便我们可以使用 httpie 模块来测试,启动Django,再在客户端输入 http://127.0.0.1:8000/snippets/,操作如下:

还可以进行 put 操作,修改对应的内容

利用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. 利用koa打造restful API

    概述 最近学习利用koa搭建API接口,小有所得,现在记录下来,供以后开发时参考,相信对其他人也有用. 就目前我所知道的而言,API有2种,一种是jsonp这种API,前端通过ajax来进行跨域请求获 ...

  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

    理解Restful架构:http://www.ruanyifeng.com/blog/2011/09/restful RESTful设计指南:http://www.ruanyifeng.com/blo ...

  8. Springboot 如何加密,以及利用Swagger2构建Restful API

    先看一下使用Swagger2构建Restful API效果图 超级简单的,只需要在pom 中引用如下jar包 <dependency> <groupId>io.springfo ...

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

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

随机推荐

  1. fail2ban的使用以及防暴力破解与邮件预警

    fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是防火墙),而且可以发送e-mail通知系统管理员! fail2ban运行机制:简单来说其功能就 ...

  2. 正则表达式最后的/i是不区分大小写的意思

    eg: "/\/*install$/i" 正则表达式 代表什么意思   /表达式的内容/ ,php中的正则表达式都必须在 / / 内 \/是匹配"/" 号,*号 ...

  3. STL 容器简介

    一.概述 STL 对定义的通用容器分三类:顺序性容器.关联式容器和容器适配器. 顺序性容器是一种各元素之间有顺序关系的线性表.元素在顺序容器中保存元素置入容器时的逻辑顺序,除非用删除或插入的操作改变这 ...

  4. 玩转mongodb(五):mongodb 3.0+ 查询性能分析

    mongodb性能分析方法:explain() 为了演示的效果,我们先来创建一个有200万个文档的记录.(我自己的电脑耗了15分钟左右插入完成.如果你想插更多的文档也没问题,只要有耐心等就可以了.) ...

  5. 开发小技巧1——Logger

    开发小技巧1——Logger 在项目中加入静态Logger类,用于捕获并记录程序的进度.错误信息:   public static class Logger { public static void ...

  6. 发布Framework 4.0到iis时,出现HTTP 错误 403.14 - Forbidden

    新发布MVC到服务器的时候,经常碰到403.14错误,绝大部分的时候都是因为Framework 4.0需要重新注册下,在运行里输入:C:\Windows\Microsoft.NET\Framework ...

  7. c#调用webservices

    有两种方式,静态调用(添加web服务的暂且这样定义)和动态调用: 静态调用: 使用添加web服务的方式支持各种参数,由于vs2010会自动转换,会生成一个特定的Reference.cs类文件   动态 ...

  8. asdfasdfasdfasdf

  9. AE开发流程

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  10. Application.DoEvents()和多线程

    首先将以下代码放到Button事件里面: private void btnStart_Click(object sender, EventArgs e)  {      for (int q = 0; ...