初次就这么给了你(Django-rest-framework)

Django-Rest-Framework

Django-Rest框架是构建Web API强大而灵活的工具包。

简单粗暴,直奔主题。

pip install djangopip install djangorestframeworkpip install pygments                 #  代码显示高亮

pip安装好需要的工具包之后,我们就开始创建一个框架。

打开终端。
cd ~    切换到根目录下, (那个目录页可以,看自己想往哪里创建)django-admin.py startproject test_restframework     # 创建工程

创建好之后切换进工程里边。cd test_restframework

工程已经创建好了,需要cd进工程里边,关键是manage.py在工程里边,我们就需要借用manage.py来进行其他的操作了。

给工程添加api

python manage.py startapp test_restapi           #  创建api

创建好之后,接下来,我们需要对django框架进行一些设置了(settings.py)

进入工程目录(test_restframework)找到settings.py,点开找见(INSTALLD_APPS)这个配置元祖,然后添加

INSTALLD_APPS = (...'rest_framework','test_restframework.apps.SnippetsConfig',          # 这里需要注意的就是  ,不添加有可能会出错)

配置添加完成之后,接下来我们改创建model了。

目录:   test_restapi/model.py

from django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styleaLEXERS = [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',)

model模型已经建好, 我们还需要模型迁移,并同步数据库。

注意:同步数据库命令是在 test_restframework下执行python manage.py makemigrations test_restapipython manage.py migrate

数据库已经同步了,我们还需要在Web API 上添加一些序列化和反序列化的实例的方法,例如 json ,我们可以通过声明序列化器来实现这一点,这些序列化器的工作方式与Django的表单相似,在test_restapi目录中创建一个serializer.py文件,添加以下代码。

from rest_framework import serializers
from test_restapi.models import Snipper, LANGUAGE_CHOICES, STYLE_CHOICESclass SnippetSerialiazer(zerializers.Serializer):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'})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):return Snippet.object.create(**validated_data)def update(self, instance, 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类的第一部分定义了被序列化反序列化的字段,create()和update()方法定义了在调用serializer.save()时如何创建或修改完全成熟的实例,

serializer类非常类似于django form类,它包括在不同的字段上的类似验证标志,如required、max_length和default。

字段标志还可以控制在某些情况下序列化程序的显示方式,比如向HTML呈现的情况。

使用序列化器

在使用之前我们需要进入Django-shell。

python manage.py shell

进入shell之后我们需要输入:

from test_restapi.models import Snippet
from test_restapi.serializers import SnippetSerializer
from rest_framework.renders import JSONRenderer
from rest_framework.parsers import JSONParsersnippet = Snippet(code='foo = "bar"\n')
snippet.save()snippet = Snippet(code='print "hello world"\n')
snippet.save()

我们已经有了一些可以使用的片段实例,让我们来看看序列化其中的一个实例吧。

serializer = SnippetSerializer(snippet)
serializer.data
# {'id': 2, 'title': u'', 'code': u'print "hello, world"\n', 'linenos': False,
'language': u'python', 'style': u'friendly'

我们已经将模型实例转化为python原生数据类型,为了完成序列化过程, 我们将数据转化为json。

content = JSONRenderer().render(serializer.data)
content
# '{"id": 2, "title": "", "code": "print \\"hello, world\\"\\n", "linenos": false,
"language": "python", "style": "friendly"}'

反序列化是相似的,首先我们解析一个流到python原生数据类型。

from django.utils.six import BytesIOstream = 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')])]

使用ModelSerializers

将test_restapi/serializers.py文件里的代码替换为:

class SnippetSerializer(serializers.ModelSerializer):class Meta:model = Snippetfields = ('id', 'title', 'code', 'linenos', 'language', 'style')

序列器有一个很好的属性,可以同过它来打印它的表示,来检查序列化器实例中所有的字段,打开 Django shell

python manage.py shell
from test_restapi.serializers import SnippetSerializer
serializer = SnippetSerializer()
print(repr(serializer))

重要的是要记住ModelSerializer类并没有做什么特别神奇的事情,它们只是创建序列化的快捷方式。

使用序列化器编写常规的django视图

目录: test_restapi/views.py

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)@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)

最后定义路由,将视图连接起来。

目录:  test_restapi/urls.py

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

目录:  test_restframework/urls.py

from django.conf.urls import url, includeurlpatterns = [url(r'^', include('test_resrapi.urls')),
]

安装httpie,我们可以通过curl来测试api,但是httpie也是一种很友好的测试包。

pip install httpie

最后启动工程

python manage.py runserver

工程起来之后,打开浏览器,输入url就可以看到结果了。  ^.^

以上资料来自官网。如有 不明白之处,可以查询官网示例:  http://www.django-rest-framework.org/tutorial/1-serialization/

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

error和exception

Error&#xff08;错误&#xff09;表示系统级的错误和程序不必处理的异常&#xff0c;是java运行环境中的内部错误或者硬件问题。比如&#xff1a;内存资源不足等。对于这种错误&#xff0c;程序基本无能为力&#xff0c;除了退出运行外别无选择&#xff0c;它是由Java虚拟机抛…

使用logminer分析日志文件

实验环境 win7 64 oracle PL/SQL Release 11.2.0.1.0 - Productionhttp://blog.csdn.net/tianlesoftware/article/details/5604497--这些操作需要在sysdba身份执行1.执行分析之前需要添加补充日志SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;查看补充日志是否开启&…

linux c++ 获取时间,详解Linux下的C++时间类型:time_t

Unix时间戳(Unix timestamp)&#xff0c;或称Unix时间(Unix time)、POSIX时间(POSIXtime)&#xff0c;是一种时间表示方式&#xff0c;定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。Unix时间戳不仅被使用在Unix系统、类Unix系统中&#xff0c;也在许多其他…

程序员的国庆节如何安排,你想好了吗?

2019独角兽企业重金招聘Python工程师标准>>> 就要国庆放假了&#xff0c;国庆节是旅游的黄金期&#xff0c;同时也是我们买买买的幸福期&#xff0c;作为一名技术开发&#xff0c;除了要安排假期旅游行程外也不要忘记提升自己&#xff0c;准备好学习计划&#xff0c…

Print! Print! Print!

print语句可以实现打印--只是对程序员友好的标准输出流的接口而已。 从技术角度来讲&#xff0c;这是把一个或多个对象转换为其文本表达形式&#xff0c;然后发送给标准输出或另一个类似文件的流。 更详细地说&#xff0c;在Python中&#xff0c;打印与文件和流的概念紧密相连。…

C#让TopMost窗体弹出并置顶层但不获取当前输入焦点的终极办法

为了使程序在弹出窗口时置顶层且不获取系统输入焦点&#xff0c;避免影响用户当前的操作&#xff0c;来电通来电弹屏软件尝试过N多种办法&#xff0c;例如&#xff1a;弹出前保存当前焦点窗口句柄&#xff0c;弹出时因为使用TopMost系统默认将焦点交给了弹出窗口&#xff0c;弹…

微服务实战(一):微服务架构的优势与不足

本文讲的是微服务实战&#xff08;一&#xff09;&#xff1a;微服务架构的优势与不足&#xff0c;【编者的话】本文来自Nginx官方博客&#xff0c;是微服务系列文章的第一篇&#xff0c;主要探讨了传统的单体式应用的不足&#xff0c;以及微服务架构的优势与挑战。正如作者所说…

linux创建zip+函数,linux+shell基础知识

目录&#xff1a;1.路径&#xff1a;2.进程&#xff1a;3.清屏和退出当前命令操作&#xff1a;4.ls 参数&#xff1a;5.创建目录\文件\复制文件&#xff1a;6.查看文件内容&#xff1a;7.linux通配符&#xff1a;8.grep:9.终止命令&#xff1a;10.搜索文件&#xff1a;11.查看网…

关于浮动float属性和position:absolute属性的区别

最近返回头看了很多书籍&#xff0c;一直在纠结float属性和absolute绝对定位的区别和使用的情况&#xff0c;给大家分享一下自己的心得和体会吧。 1&#xff0c;float属性 float属性意义是让元素拜托独占一行的霸道总裁&#xff0c;成为一个普普通通的人。比如下面这个例子 如图…

Climbing Stairs

You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? 分析&#xff1a;考虑走第n步时的情况&#xff0c;可以从第n-1个台阶走一步&#xff0c;也可以从…

3dmax linux版本,如何安装Linux版FLOW-3D及注意事项

如何安装Linux版FLOW-3D及注意事项安装Linux版的flow3d流程&#xff1a;1、复制flow3d安装CD盘中unix文件夹到Linux系统桌面&#xff1b;(或从CD中直接安装也可以)2、从terminal进入unix文件夹&#xff1b;3、./install或./install_flow3d4、提示是否接受license协议&#xff0…

高级组合技打造“完美” 捆绑后门

0x00 简介 之前写过一篇关于客户端钓鱼的文章&#xff1a;《使用powershell Client进行有效钓鱼》中&#xff0c;在使用各个Client进行测试的过程中&#xff0c;个人发现CHM文件是最好用的一个&#xff0c;但是其缺点就是会弹黑框&#xff0c;这样就会让被攻击者察觉。那么怎么…

使用友盟分享心得(SSO登陆,不能获取accesstoken,不能跳转APPSSO登陆的问题)

在xcode5中plist 文件是默认有 Bundle DisplayName的 而如果工程是在xcode6环境下开发的话。 这时候就会出现友盟无法跳转微博跟QQSSO的问题。 solution&#xff1a;在plist中加入bundle DisplayName 转载于:https://www.cnblogs.com/ZippoatiOS/p/4443933.html

linux单线程处理多个请求,redis是单线程的,如何处理并发请求?

疑问&#xff1a;redis是单线程的&#xff0c;如何并发处理多个请求&#xff1f;下面是我个人的理解。答案是&#xff1a;使用操作系统的多进程机制。也就是我们常说的&#xff0c;多路复用API&#xff0c;多路复用API本质上是对操作系统多路复用功能的封装。什么是操作系统的多…

Cloudera Manager内部结构、功能包括配置文件、目录位置等

2019独角兽企业重金招聘Python工程师标准>>> 问题导读 1.CM的安装目录在什么位置&#xff1f; 2.hadoop配置文件在什么位置&#xff1f; 3.Cloudera manager运行所需要的信息存在什么位置&#xff1f; 4.CM结构和功能是什么&#xff1f; 1. 相关目录 /var/log/cloud…

python 学习笔记(一)

在Windows上安装Python 首先&#xff0c;从Python的官方网站www.python.org下载最新的2.7.9版本&#xff0c;地址是这个&#xff1a; http://www.python.org/ftp/python/2.7.9/python-2.7.9.msi 然后&#xff0c;运行下载的MSI安装包&#xff0c;在选择安装组件的一步时&#x…

An ffmpeg and SDL Tutorial

http://dranger.com/ffmpeg/转载于:https://www.cnblogs.com/qwertWZ/p/4447141.html

linux模式匹配,sed的模式匹配用法探讨

[rootsunsky Desktop]# cat sunskyabcdef[rootsunsky Desktop]# cat sunsky|sed 1,2d|sed 1,2def[rootsunsky Desktop]# cat sunsky|sed -e 1,2d -e 1,2ddef问题&#xff1a;sed中-e的意思是直接在指令列模式上进行sed的动作编辑按照&#xff0c;那么按照-e的含义&#xff0c;上…

Qualcomm QXDM工具简介和log抓取

高通工具简介QXDM 简介QXDM 安装QXDM 激活QXDM 使用AT打开Diagnostic口 QXDM 配置1 Message View ConfigurationMessage PacketsLog PacketsLog PacketsOTAEvent ReportsStrings2 Log View Config3 QXDM-保存配置文件4 QXDM-导入配置文件QPST 端口配置QXDM 抓取log QXDM LOG保存…

layout_gravity

layout_gravity——当前View&#xff0c;本身&#xff0c;在父一级的控件所分配的显示范围内的&#xff0c;对齐方式常用在&#xff1a; 当前控件&#xff08;在父一级LineLayout所分配给其的显示范围内&#xff09;的对齐方式需要注意的是&#xff0c;如果TableRow的gravity确…