REST_FRAMEWORK加深记忆-第二次练习官方文档2
优化前和优化后的代码,融在一起,能看看进化的过程。
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',)
URLS.PY
- from django.conf.urls import url
- from rest_framework.urlpatterns import format_suffix_patterns
- from snippets import views
- urlpatterns = [
- url(r'^snippets/$', views.snippet_list),
- url(r'snippets/(?P<pk>[0-9]+)/$', views.snippet_detail),
- ]
- urlpatterns = format_suffix_patterns(urlpatterns)
VIEWS.PY
- from django.http import HttpResponse
- from rest_framework import status
- from rest_framework.decorators import api_view
- from rest_framework.response import Response
- 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
- class JSONResponse(HttpResponse):
- def __init__(self, data, **kwargs):
- content = JSONRenderer().render(data)
- kwargs['content_type'] = 'application/json'
- super(JSONResponse, self).__init__(content, **kwargs)
- @csrf_exempt
- def snippet_list_old(request):
- if request.method == 'GET':
- snippets = Snippet.objects.all()
- serializer = SnippetSerializer(snippets, many=True)
- return JSONResponse(serializer.data)
- 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_old(request, pk):
- 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)
- @api_view(['GET', 'POST'])
- def snippet_list(request, format=None):
- if request.method == 'GET':
- snippets = Snippet.objects.all()
- serializer = SnippetSerializer(snippets, many=True)
- return Response(serializer.data)
- elif request.method == 'POST':
- serializer = SnippetSerializer(data=request.data)
- if serializer.is_valid():
- serializer.save()
- return Response(serializer.data, status=status.HTTP_201_CREATED)
- return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
- @api_view(['GET', 'PUT', 'DELETE'])
- def snippet_detail(request, pk, format=None):
- try:
- snippet = Snippet.objects.get(pk=pk)
- except Snippet.DoesNotExist:
- return Response(status=status.HTTP_404_NOT_FOUND)
- if request.method == 'GET':
- serializer = SnippetSerializer(snippet)
- return Response(serializer.data)
- elif request.method == 'PUT':
- serializer = SnippetSerializer(snippet, data=request.data)
- if serializer.is_valid():
- serializer.save()
- return Response(serializer.data)
- return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
- elif request.method == 'DELETE':
- snippet.delete()
- return Response(status=status.HTTP_204_NO_CONTENT)
SERIALIZER.PY
- from rest_framework import serializers
- from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES
- class SnippetSerializer(serializers.ModelSerializer):
- class Meta:
- model = Snippet
- fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
- class SnippetSerializerOld(serializers.Serializer):
- pk = 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.objects.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
REST_FRAMEWORK加深记忆-第二次练习官方文档2的更多相关文章
- REST_FRAMEWORK加深记忆-第二次练习官方文档
我想,其它几个基于PYTHON的REST API模块概念都差不多吧. 先深入搞定这个吧. 前几次练习完了有一些印象,并且在工作中实践过一个,现在多弄几次,玩熟悉点. Serializers.py __ ...
- REST_FRAMEWORK加深记忆-极致抽象,极致完结
余下的就是静心看官方文档了. 这个是最抽象的了. urls.py """tutorial URL Configuration The `urlpatterns` list ...
- Mysql优化(出自官方文档) - 第二篇
Mysql优化(出自官方文档) - 第二篇 目录 Mysql优化(出自官方文档) - 第二篇 1 关于Nested Loop Join的相关知识 1.1 相关概念和算法 1.2 一些优化 1 关于Ne ...
- 【AutoMapper官方文档】DTO与Domin Model相互转换(中)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...
- 一起学微软Power BI系列-官方文档-入门指南(2)获取源数据
我们在文章: 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍中,我们介绍了官方入门文档的第一章.今天继续给大家介绍官方文档中,如何获取数据源的相关内容.虽然是英文,但 ...
- Hui之Hui.js 官方文档
基础 // 判断值是否是指定数据类型 var result = hui.isTargetType("百签软件", "string"); //=>true ...
- Spark官方文档 - 中文翻译
Spark官方文档 - 中文翻译 Spark版本:1.6.0 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 引入Spark(Linki ...
- TestNG官方文档中文版(2)-annotation
TestNG的官方文档的中文翻译版第二章,原文请见 http://testng.org/doc/documentation-main.html 2 - Annotation 这里是TestNG中用到的 ...
- Spring 4 官方文档学习(十二)View技术
关键词:view technology.template.template engine.markup.内容较多,按需查用即可. 介绍 Thymeleaf Groovy Markup Template ...
随机推荐
- 从源码看java中Integer的缓存问题
在开始详细的说明问题之前,我们先看一段代码 public static void compare1(){ Integer i1 = 127, i2 = 127, i3 = 128, i4 = 128; ...
- Linux命令行提示符设置
我们使用Linux系统时接触最多的是它的命令行窗口,很多时候我们都需要在命令行上输入命令,在输入的命令前都会有提示符,一般系统默认的提示符形式是:[username@host 工作目录]$. 其实,我 ...
- php 获取数组第一个值的方法分享
以下是对使用php实现获取数组第一个值的方法进行了详细的分析介绍,需要的朋友可以过来参考下 reset (PHP 3, PHP 4, PHP 5)reset -- 将数组的内部指针指向第一个单元 说明 ...
- localStorage变更事件当前页响应新解
html5的localStorage相信大家都是很熟悉了,但是在chrome等支持该对象的浏览器中(ie10除外),如果你监听 storage变更事件你就会发现,当数据发生变化时本页是监听不到stor ...
- .NET SDK和下载
http://blogs.msdn.com/b/dotnet/p/dotnet_sdks.aspx .NET SDK和下载 您可以通过下载.NET框架针对包和软件开发工具包,并使用它们与Visual ...
- WPF中的瀑布流布局(TilePanel)控件
最近在用wpf做一个metro风格的程序,需要用到win8风格的布局容器,只能自己写一个了.效果如下 用法 : <local:TilePanel ...
- EWOULDBLOCK = EAGAIN
#define EAGAIN 11 /* Try again */ #define EINTR 4 /* Interrupted system call */ #define EWOULDBLOCK ...
- JDBC ----常用数据库的驱动程序及JDBC URL:
常用数据库的驱动程序及JDBC URL: Oracle数据库: 驱动程序包名:ojdbc14.jar 驱动类的名字:oracle.jdbc.driver.OracleDriver JDBC URL ...
- Entity Framework(一) 映射
ADO.NET Entity Framework通过Modeel First和DataBase First,提供了几个把数据库表映射到对象上的曾.通过Database First,可以从一个数据库架构 ...
- 什么是Hadoop,怎样学习Hadoop
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS.HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上:而且它 ...