利用Django实现RESTful API(一)
RESTful API现在很流行,这里是它的介绍 理解RESTful架构和 RESTful API设计指南.按照Django的常规方法当然也可以实现REST,但有一种更快捷、强大的方法,那就是 Django REST framework.它是python的一个模块,通过在Django里面配置就可以把app的models中的各个表实现RESTful API。下面是实现方法:
一、安装配置
- pip install djangorestframework
- pip install markdown # Markdown support for the browsable API.
- 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 中添加一张表如下:

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

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

- from rest_framework import serializers
- from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES
- class SnippetSerializer(serializers.Serializer): # 它序列化的方式很类似于Django的forms
- id = serializers.IntegerField(read_only=True)
- title = serializers.CharField(required=False, allow_blank=True, max_length=100)
- code = serializers.CharField(style={'base_template': 'textarea.html'}) # style的设置等同于Django的
widget=widgets.Textarea
- linenos = serializers.BooleanField(required=False) # 用于对浏览器的上的显示
- language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
- style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')
- def create(self, validated_data):
- """
- Create and return a new `Snippet` instance, given the validated data.
- """
- return Snippet.objects.create(**validated_data)
- def update(self, instance, validated_data):
- """
- Update and return an existing `Snippet` instance, given the validated data.
- """
- instance.title = validated_data.get('title', instance.title)
- instance.code = validated_data.get('code', instance.code)
- instance.linenos = validated_data.get('linenos', instance.linenos)
- instance.language = validated_data.get('language', instance.language)
- instance.style = validated_data.get('style', instance.style)
- instance.save()
- return instance

三、使用Serializer
先使用 ./manage.py shell 进入Django的shell中。操作如下:
可以看到 Serializer 的使用如同 Django 的 forms.它的反序列化如下:
- from django.utils.six import BytesIO
- stream = BytesIO(content)
- data = JSONParser().parse(stream)
这是再把得到的数据转化为实例:

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

同时,我们还可以对 querysets 进行序列化,只需简单地在设置参数 many=True,如下:
- serializer = SnippetSerializer(Snippet.objects.all(), many=True)
- serializer.data
- # [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中的表。如下:
- class SnippetSerializer(serializers.ModelSerializer):
- class Meta:
- model = Snippet
- fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
五、在Django的视图中使用Serializer
首先,可以像常规Django视图的写法一样写,返回序列化的输出数据。

- from django.http import HttpResponse, JsonResponse
- from django.views.decorators.csrf import csrf_exempt
- from rest_framework.renderers import JSONRenderer
- from rest_framework.parsers import JSONParser
- from snippets.models import Snippet
- from snippets.serializers import SnippetSerializer
- @csrf_exempt
- def snippet_list(request):
- """
- List all code snippets, or create a new snippet.
- """
- if request.method == 'GET':
- snippets = Snippet.objects.all()
- serializer = SnippetSerializer(snippets, many=True)
- return JsonResponse(serializer.data, safe=False)
- elif request.method == 'POST':
- data = JSONParser().parse(request)
- serializer = SnippetSerializer(data=data)
- if serializer.is_valid():
- serializer.save()
- return JsonResponse(serializer.data, status=201)
- return JsonResponse(serializer.errors, status=400)

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

- @csrf_exempt
- def snippet_detail(request, pk):
- """
- Retrieve, update or delete a code snippet.
- """
- try:
- snippet = Snippet.objects.get(pk=pk)
- except Snippet.DoesNotExist:
- return HttpResponse(status=404)
- if request.method == 'GET':
- serializer = SnippetSerializer(snippet)
- return JsonResponse(serializer.data)
- elif request.method == 'PUT':
- data = JSONParser().parse(request)
- serializer = SnippetSerializer(snippet, data=data)
- if serializer.is_valid():
- serializer.save()
- return JsonResponse(serializer.data)
- return JsonResponse(serializer.errors, status=400)
- elif request.method == 'DELETE':
- snippet.delete()
- return HttpResponse(status=204)

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

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

最后还要在根目录的 url.py 中添加对应的映射。
- urlpatterns = [
...- url(r'^', include('snippets.urls')),
- ]
这时,所有的配置已经完成了。接下来就是测试我们的API
六、测试API
为了方便我们可以使用 httpie 模块来测试,启动Django,再在客户端输入
http://127.0.0.1:8000/snippets/,操作如下:
还可以进行 put 操作,修改对应的内容
利用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代表着一个资源.当然我 ...
- 利用koa打造restful API
概述 最近学习利用koa搭建API接口,小有所得,现在记录下来,供以后开发时参考,相信对其他人也有用. 就目前我所知道的而言,API有2种,一种是jsonp这种API,前端通过ajax来进行跨域请求获 ...
- 使用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
理解Restful架构:http://www.ruanyifeng.com/blog/2011/09/restful RESTful设计指南:http://www.ruanyifeng.com/blo ...
- Springboot 如何加密,以及利用Swagger2构建Restful API
先看一下使用Swagger2构建Restful API效果图 超级简单的,只需要在pom 中引用如下jar包 <dependency> <groupId>io.springfo ...
- Django编写RESTful API(五):添加超链接提高模型间的关联性
前言 在第四篇中,加入了用户模型,以及相关的认证和权限的功能.但是我们在使用的时候,会发现在访问http://127.0.0.1:8000/users/时看到的用户列表,不能够直接点击某个链接然后查看 ...
随机推荐
- fail2ban的使用以及防暴力破解与邮件预警
fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是防火墙),而且可以发送e-mail通知系统管理员! fail2ban运行机制:简单来说其功能就 ...
- 正则表达式最后的/i是不区分大小写的意思
eg: "/\/*install$/i" 正则表达式 代表什么意思 /表达式的内容/ ,php中的正则表达式都必须在 / / 内 \/是匹配"/" 号,*号 ...
- STL 容器简介
一.概述 STL 对定义的通用容器分三类:顺序性容器.关联式容器和容器适配器. 顺序性容器是一种各元素之间有顺序关系的线性表.元素在顺序容器中保存元素置入容器时的逻辑顺序,除非用删除或插入的操作改变这 ...
- 玩转mongodb(五):mongodb 3.0+ 查询性能分析
mongodb性能分析方法:explain() 为了演示的效果,我们先来创建一个有200万个文档的记录.(我自己的电脑耗了15分钟左右插入完成.如果你想插更多的文档也没问题,只要有耐心等就可以了.) ...
- 开发小技巧1——Logger
开发小技巧1——Logger 在项目中加入静态Logger类,用于捕获并记录程序的进度.错误信息: public static class Logger { public static void ...
- 发布Framework 4.0到iis时,出现HTTP 错误 403.14 - Forbidden
新发布MVC到服务器的时候,经常碰到403.14错误,绝大部分的时候都是因为Framework 4.0需要重新注册下,在运行里输入:C:\Windows\Microsoft.NET\Framework ...
- c#调用webservices
有两种方式,静态调用(添加web服务的暂且这样定义)和动态调用: 静态调用: 使用添加web服务的方式支持各种参数,由于vs2010会自动转换,会生成一个特定的Reference.cs类文件 动态 ...
- asdfasdfasdfasdf
- AE开发流程
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- Application.DoEvents()和多线程
首先将以下代码放到Button事件里面: private void btnStart_Click(object sender, EventArgs e) { for (int q = 0; ...