djangorestframework框架笔记(1) 实例化对象

安装环境

pip install django pip install djangorestframework pip install pygmentshtml

###建立项目 咱们如今须要建立一个django的项目,下面的代码的功能是建立一个名为tutorial的django项目python

cd ~ django-admin.py startproject tutorial cd tutorialweb

项目建立完成以后咱们须要建立一个简单的web api的应用程序shell

python3 manage.py startapp snippets数据库

咱们编辑settings.py文件,将新程序和rest_framework应用添加到INSTALLED_APPS里面django

INSTALLED_APPS = (
    'rest_framework',
    'snippets.apps.SnippetsConfig',
)

###建立一个数据模型 咱们将新建立的项目加载以后咱们如今须要作的是建立一个数据的模型,咱们在snippets/models.py添加一个Snippet的模型json

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',)

**在第一次建立模型以后,咱们须要对其进行迁移和同步,将其更改写入到数据库当中 **api

python3 manage.py makemigrations snippet
python3 manage.py migrate

建立一个序列化类

在使用这些模型以前,咱们须要提供一个序列化和反序列化的方法,将snippet的实例转换成json的形式。咱们建立一个新的文件serializers.py,而且添加下面的代码.跨域

from rest_framework import serializers

from snippets.models import Snippet,LANGUAGE_CHOICES,STYLE_CHOICES

class SnippetSerializer(serializers.Serializer):

    """建立Snippets的序列化类"""

    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):
        """经过传一个validated_data来建立和返回一个'Snippet'的实例"""
        return Snippet.objects.create(**validated_data)
    def update(self,instance, validated_data):
        """经过传入validated_data来更新已有的Snippet实例

        :validated_data: TODO
        :returns: TODO

        """
        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是根据传入的validated_data建立一个新的实例,而update是根据传入的数据进行更新已有的实例。bash

serializer类很是相似django的表单类,提供了一些建立时的验证标记,好比required,max_length和default 在字段标识的时候能够指定serializer以怎样的形式进行显现,好比以html的方式.

有关{'bash_template':'textarea.html'}的等同于django 表单类中的widget=widgets.Textarea,这种方式在构建可浏览的api时特别的有用.

使用Serializers

在进一步操做以前,咱们经过shell的方式来使用serializer类

python3 manage.py shell

下面的代码段让咱们建立了两个snippets实例

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser

snippet = Snippet(code='foo = "bar"\n')
snippet.save()

snippet = Snippet(code='print "hello, world"\n')
snippet.save()

如今咱们有了二个snippet的实例,咱们经过SnippetSerializer来对其进行序列化,而且打印序列化以后的数据.

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

一样的咱们能够以JSON的方式进行数据的显示

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

反序列化也是相似的,咱们读取相应的数据而且进行数据的解析成特定类型的数据。

from django.utils.six import BytesIO

stream = BytesIO(content)
data = JSONParser().parse(stream

###在view中实现Serializer 咱们 经过建立一个HttpResponse类来将数据经过json的方式进行呈现. 将下面的代码添加到snippets/views.py当中。

from django.http import HttpResponse
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):
    """
    An HttpResponse that renders its content into JSON.
    """
    def __init__(self, data, **kwargs):
        content = JSONRenderer().render(data)
        kwargs['content_type'] = 'application/json'
        super(JSONResponse, self).__init__(content, **kwargs)

如今咱们编写一个视图来显示全部的snippet列表

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

    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 解除跨域 post 限制 咱们一样须要提供一个对特定的snippet进行操做的视图,可以对其进行 检索、更新或删除

最后咱们须要在snippets里面建立一个urls.py的文件 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),
]

咱们更新tutorial/urls.py文件,使其包含snippet的urls

from django.conf.urls import url, include

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

###测试实例 经过运行下面的命令来启动django服务

python manage.py runserver Performing system checks... System check identified no issues (0 silenced). April 11, 2016 - 13:51:47 Django version 1.9.5, using settings 'tutorial.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.

咱们经过安装httpie来测试

pip3 install htppie

咱们能够获取全部的snippets列表 ![屏幕快照 2016-04-11 下午9.53.33](http://7xrkms.com1.z0.glb.clouddn.com/2016-04-11-屏幕快照 2016-04-11 下午9.53.33.png)

或者咱们能够经过特定的snippet id来获取特定的snippet内容

![屏幕快照 2016-04-11 下午9.54.36](http://7xrkms.com1.z0.glb.clouddn.com/2016-04-11-屏幕快照 2016-04-11 下午9.54.36.png)

下面的是完整 项目文件: ![屏幕快照 2016-04-11 下午9.55.25](http://7xrkms.com1.z0.glb.clouddn.com/2016-04-11-屏幕快照 2016-04-11 下午9.55.25.png)

相关文章
相关标签/搜索