RESTful API现在很流行,这里是它的介绍 理解RESTful架构和 RESTful API设计指南.按照Django的常规方法当然也可以实现REST,但有一种更快捷、强大的方法,那就是 Django RESTframework.它是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,如下:

INSTALLED_APPS = (

...

'rest_framework',

)

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

urlpatterns = [

...

url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))

]

二、创建model和Serializer

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

from django.db importmodelsfrom pygments.lexers importget_all_lexers # 一个实现代码高亮的模块from pygments.styles importget_all_styles

LEXERS= [item for item in get_all_lexers() if item[1]]

LANGUAGE_CHOICES= sorted([(item[1][0], item[0]) for item inLEXERS]) # 得到所有编程语言的选项

STYLE_CHOICES= sorted((item, item) for item inget_all_styles()) # 列出所有配色风格classSnippet(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)classMeta:

ordering= ('created',)

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

./manage.py makemigrations snippets

./manage.py migrate

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

from rest_framework importserializersfrom snippets.models importSnippet, LANGUAGE_CHOICES, STYLE_CHOICESclassSnippetSerializer(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')defcreate(self, validated_data):"""Create and return a new `Snippet` instance, given the validated data."""

return Snippet.objects.create(**validated_data)defupdate(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 importBytesIO

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()#

同时,我们还可以对 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中的表。如下:

classSnippetSerializer(serializers.ModelSerializer):classMeta:

model=Snippet

fields= ('id', 'title', 'code', 'linenos', 'language', 'style')

五、在Django的视图中使用Serializer

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

from django.http importHttpResponse, JsonResponsefrom django.views.decorators.csrf importcsrf_exemptfrom rest_framework.renderers importJSONRendererfrom rest_framework.parsers importJSONParserfrom snippets.models importSnippetfrom snippets.serializers importSnippetSerializer

@csrf_exemptdefsnippet_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)ifserializer.is_valid():

serializer.save()return JsonResponse(serializer.data, status=201)return JsonResponse(serializer.errors, status=400)

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

@csrf_exemptdefsnippet_detail(request, pk):"""Retrieve, update or delete a code snippet."""

try:

snippet= Snippet.objects.get(pk=pk)exceptSnippet.DoesNotExist:return HttpResponse(status=404)if request.method == 'GET':

serializer=SnippetSerializer(snippet)returnJsonResponse(serializer.data)elif request.method == 'PUT':

data=JSONParser().parse(request)

serializer= SnippetSerializer(snippet, data=data)ifserializer.is_valid():

serializer.save()returnJsonResponse(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 importurlfrom snippets importviews

urlpatterns=[

url(r'^snippets/$', views.snippet_list),

url(r'^snippets/(?P[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 操作,修改对应的内容

如此简单。。。。。。。

python django restful_利用Django实现RESTful API(一)相关推荐

  1. vue 多个api请求_Vue+Django REST framework实战3.RESTful API和VUE目录结构

    内容提要: RESTful API和VUE基础概念. <Python前后端分离开发Vue+Django REST framework实战>作者bobby --学习来源 第四章 RESTfu ...

  2. Python Day 70 利用Django框架做的一个bbs小项目

    ##项目开发流程 #1.项目需求分析产品经理+架构师+开发经理/组长 去到客户的公司谈需求(博弈的过程) #2.项目架构设计 架构师设计(数据库(主库:MySQL,从库:redis,mongodb), ...

  3. 笔记︱利用python + flask制作一个简易本地restful API

    原版官网:http://flask-restful.readthedocs.io/en/latest/ 中文官网:http://www.pythondoc.com/Flask-RESTful/quic ...

  4. 【Python案例】——利用Django搭建一个钓鱼网站【轻松入门】

    目录 (1)最终实现效果​编辑 (2)安装Django模块 (3)创建Django项目 (4)查看项目是否环境配置成功 (5)点击进入settings.py文件,进行定制化修改 (6)导入所需文件 ( ...

  5. django jsonresponse_利用 Django 动态展示 Pyecharts 图表数据的几种方法

    本文将介绍如何在 web 框架 Django 中使用可视化工具 Pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法! Django 模板渲染 1. 新建一个 Django 项目 命令 ...

  6. python实现api server,初学python,准备学习做个restful api server,现在有些困惑

    在网上看到个教程 from flask import Flask, jsonify app = Flask(__name__) tasks = [ { 'id': 1, 'title': u'Buy ...

  7. python实现简单的api接口-用python写一个restful API

    # -*- coding: utf-8 -*- # 作者: 煮酒品茶 """ package.module ~~~~~~~~~~~~~~ python实现的图书的一个re ...

  8. python restful api_用Python语言写一个restful API

    本文主要向大家介绍了用Python语言写一个restful API,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. """ package.modul ...

  9. Spring Boot注解完成Restful API

    利用注解完成Restful API @RestController public class HelloController { @RequestMapping("/hello") ...

  10. python django restful_详解Django rest_framework实现RESTful API

    一.什么是REST 面向资源是REST最明显的特征,资源是一种看待服务器的方式,将服务器看作是由很多离散的资源组成.每个资源是服务器上一个可命名的抽象概念.因为资源是一个抽象的概念,所以它不仅仅能代表 ...

最新文章

  1. 从某一日期开始过day天的日期
  2. @2021高考生,用 Python 分析专业“钱景”
  3. Linux 标准目录结构 FHS
  4. POJ 1961 KMP(当前重复次数)
  5. Python异常处理体系简介(1)
  6. 使用Nomad构建弹性基础架构: 容错和中断恢复
  7. 自定义注解:通过监控文件的变化,实时更改工厂管理的实例
  8. HDU 1875 畅通工程再续 (最小生成树)
  9. java media_unmount file_(20120801)android文件的读写SD卡总结
  10. 如何修复提交错误的Git分支?
  11. 动态规划入门之最长公共子序列
  12. 北方交大的开源软件镜像站
  13. 毕业设计:基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类
  14. Xcode8控制台不打印NSLog
  15. 如何在微信中(微信公众号页面)给Vue单页应用设置标题
  16. 樊登读书赋能读后感_樊登读书会本周末视频解读新书:《赋能》突破深井,打造优质团队...
  17. pb导入excel文件
  18. 关于sp和unity近似的PBR的一篇国外文章
  19. 二阶可导的充要条件_可导函数在x
  20. ButterKnife onclick点击事件没反应

热门文章

  1. 服务器在无盘网吧的现在与将来(1)
  2. Warning the user/local/mysql/data directory is not owned by the mysql user
  3. SpringMvc 文件上传注意事项
  4. jquery刷新iframe页面的方法
  5. Hive内部表外部表转化分析(装)
  6. 分析java 嵌套类与内部类
  7. .NET基础知识(一)
  8. [转]Authority-check
  9. java jxl 复制单元格_如何用JAVA(如poi、jxl等)读取excel文件中的下拉框单元格的值。...
  10. Linux 文件系统(三)---dup和fork函数执行后的文件情况