Django REST框架使用

参考网站:http://www.django-rest-framework.org/tutorial/1-serialization/

首先,需要安装django,djangorestframework,pygments等包。

安装方法

pip install django
pip install djangorestframework
pip install pygments

创建django项目

django-admin startproject RESTful

cd RESTful

python manage.py startapp snippets



在 RESTful/settings.py文件中添加

INSTALLED_APPS = [
    ...
    'rest_framework',
    'snippets',
]

编辑 ​​​​​​snippets/models.py文件

from django.db import models

class Snippet(models.Model):
    title = models.CharField(max_length=100,blank=True,default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    

此时,需要为我们的模型创建初始迁移,并同步数据库。

python manage.py makemigrations

python manage.py migrate

snippets的目录下创建一个文件serializers.py并编辑

from rest_framework import serializers
from snippets.models import Snippet

class SnippetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Snippet
        fields = ('id','title','code','linenos')

进入Django shell

python manage.py shell

在shell中进行如下操作

>>>from snippets.models import Snippet
>>>from snippets.serializers import SnippetSerializer

>>>snippet = Snippet(code='哈哈')
>>>snippet.save()
>>>#我们往数据库里插入了一条数据,现在让我们序列化这个实例
>>>serializer = SnippetSerializer(snippet)
>>>serializer.data
{'id': 1, 'title': '', 'code': '哈哈', 'linenos': True}
>>>#现在让我们多插入几条数据
>>>snippet = Snippet(code='嘻嘻')
>>>snippet.save()
>>>snippet = Snippet(code='哼哼')
>>>snippet.save()
>>>#你也可以查看数据格式
>>>serializer1 = SnippetSerializer()
>>>print(str(serializer1))
SnippetSerializer():
    id = IntegerField(label='ID', read_only=True)
    title = CharField(allow_blank=True, max_length=100, required=False)
    code = CharField(style={'base_template': 'textarea.html'})
    linenos = BooleanField(required=False)
>>>#序列化操作
>>>from rest_framework.renderers import JSONRenderer
>>>from rest_framework.parsers import JSONParser
>>>content = JSONRenderer().render(serializer.data)
>>>content
b'{"id":1,"title":"","code":"\xe5\x93\x88\xe5\x93\x88","linenos":true}'
>>>#反序列化操作
>>>from django.utils.six import BytesIO
>>>stream = BytesIO(content)
>>>stream
<_io.BytesIO object at 0x7f3ff8bb8990>
>>>data = JSONParser().parse(stream)
>>>data
{'id': 1, 'title': '', 'code': '哈哈', 'linenos': True}
>>>#现在将原始数据类型还原为完全填充的对象实例
>>>serializer = SnippetSerializer(data=data)
>>>serializer.is_valid()
True
>>>serializer.validated_data
OrderedDict([('title', ''), ('code', '哈哈'), ('linenos', True)])
>>>#序列化查询集,只需many=True在序列化程序参数中添加一个标志
>>>serializer = SnippetSerializer(Snippet.objects.all(),many=True)
>>>serializer.data
[OrderedDict([('id', 1), ('title', ''), ('code', '哈哈'), ('linenos', True)]), OrderedDict([('id', 2), ('title', ''), ('code', '嘻嘻'), ('linenos', True)]), OrderedDict([('id', 3), ('title', ''), ('code', '哼哼'), ('linenos', True)]),]
>>>exit()

接下来使用Serializer编写常规Django视图

编辑snippets/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):
    
    #查询所有
    if request.method == 'GET':
        snippets = Snippet.objects.all()
        serializer = SnipperSerializer(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_datail(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 == 'POST':
        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.dalete()
        return HttpResponse(status=204)


    

接下来连接这些视图,创建snippets/urls.py

from django.conf.urls import url
from snippets import views

urlpatterns = [
    url(r'snip/$',views.snippet_list),
    url(r'snip/(?P<pk>[0-9]+)/$',views.snippet_datail),
]

修改RESTful/urls.py文件,添加如下代码

from django.conf.urls import url,include

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

]

最后,启动服务

python manage.py runserver 

在另一个终端窗口中来进行测试

我们利用httpie来测试我们的API,安装方法如下

pip install httpie

操作如下

(django_venv) j:~/pythonfile$ http http://127.0.0.1:8000/snip/
HTTP/1.0 200 OK
Content-Length: 260
Content-Type: application/json
Date: Fri, 10 Aug 2018 02:21:46 GMT
Server: WSGIServer/0.2 CPython/3.6.4
X-Frame-Options: SAMEORIGIN

[
    {
        "code": "哈哈",
        "id": 1,
        "linenos": true,
        "title": ""
    },
    {
        "code": "嘻嘻",
        "id": 2,
        "linenos": true,
        "title": ""
    },
    {
        "code": "哼哼",
        "id": 3,
        "linenos": true,
        "title": ""
    }
]

(django_venv) j:~/pythonfile$ http post http://127.0.0.1:8000/snip/ code="撒有哪啦"
HTTP/1.0 201 Created
Content-Length: 75
Content-Type: application/json
Date: Fri, 10 Aug 2018 02:22:36 GMT
Server: WSGIServer/0.2 CPython/3.6.4
X-Frame-Options: SAMEORIGIN

{
    "code": "撒有哪啦",
    "id": 4,
    "linenos": true,
    "title": ""
}

(django_venv) j:~/pythonfile$ http http://127.0.0.1:8000/snip/
HTTP/1.0 200 OK
Content-Length: 337
Content-Type: application/json
Date: Fri, 10 Aug 2018 02:22:40 GMT
Server: WSGIServer/0.2 CPython/3.6.4
X-Frame-Options: SAMEORIGIN

[
    {
        "code": "哈哈",
        "id": 1,
        "linenos": true,
        "title": ""
    },
    {
        "code": "嘻嘻",
        "id": 2,
        "linenos": true,
        "title": ""
    },
    {
        "code": "哼哼",
        "id": 3,
        "linenos": true,
        "title": ""
    },
    {
        "code": "撒有哪啦",
        "id": 4,
        "linenos": true,
        "title": ""
    }
]

(django_venv) j:~/pythonfile$ http http://127.0.0.1:8000/snip/2/
HTTP/1.0 200 OK
Content-Length: 63
Content-Type: application/json
Date: Fri, 10 Aug 2018 02:22:53 GMT
Server: WSGIServer/0.2 CPython/3.6.4
X-Frame-Options: SAMEORIGIN

{
    "code": "嘻嘻",
    "id": 2,
    "linenos": true,
    "title": ""
}

(django_venv) j:~/pythonfile$ http put http://127.0.0.1:8000/snip/2/ code="嘻唰唰"
HTTP/1.0 200 OK
Content-Length: 69
Content-Type: application/json
Date: Fri, 10 Aug 2018 02:23:20 GMT
Server: WSGIServer/0.2 CPython/3.6.4
X-Frame-Options: SAMEORIGIN

{
    "code": "嘻唰唰",
    "id": 2,
    "linenos": true,
    "title": ""
}

(django_venv) j:~/pythonfile$ http delete http://127.0.0.1:8000/snip/3/
HTTP/1.0 204 No Content
Content-Length: 0
Content-Type: text/html; charset=utf-8
Date: Fri, 10 Aug 2018 02:23:44 GMT
Server: WSGIServer/0.2 CPython/3.6.4
X-Frame-Options: SAMEORIGIN

(django_venv) j:~/pythonfile$ http http://127.0.0.1:8000/snip/
HTTP/1.0 200 OK
Content-Length: 278
Content-Type: application/json
Date: Fri, 10 Aug 2018 02:23:53 GMT
Server: WSGIServer/0.2 CPython/3.6.4
X-Frame-Options: SAMEORIGIN

[
    {
        "code": "哈哈",
        "id": 1,
        "linenos": true,
        "title": ""
    },
    {
        "code": "嘻唰唰",
        "id": 2,
        "linenos": true,
        "title": ""
    },
    {
        "code": "撒有哪啦",
        "id": 4,
        "linenos": true,
        "title": ""
    }
]

当然,您也可以通过浏览器来访问这些URL来显示出相同的JSON。

以上就是全部内容了,欢迎各位评论。

猜你喜欢

转载自blog.csdn.net/j123__/article/details/81559479