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時特別的有用.
在進一步操做以前,咱們經過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)