RESTful API 不多做介绍,按照Django的常规方法也可以实现REST,但有一种更快捷、强大的方法,那就是Django REST framework,它是python的一个模块,通过在Django里面配置就可以把app的models中的各个表实现RESTful API。

一、安装配置

1
2
3
pip install djangorestframework
pip install markdown # Markdown support for the browsable API
pip install django-filter # Filtering support

再到Django项目的的settings.py中添加如下:

1
2
3
4
INSTALLED_APPS = (
...
'rest_framework',
)

urls.py文件中添加url:

1
2
3
4
urlpatterns = [
...
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

二、创建model和Serializer

1)model

还用之前的Student:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from django.db import models
from django.utils.html import format_html


class Student(models.Model):
id = models.AutoField(verbose_name='id', max_length=100, primary_key=True)
username = models.CharField(verbose_name='姓名', max_length=100)
password = models.CharField(verbose_name='密码', max_length=100)
email = models.CharField(verbose_name='邮箱', max_length=100)
have = models.CharField(verbose_name='是否拥有', max_length=100)

role_choices = (
('daye', '打野'),
('fashi', '法师'),
('sheshou', '射手'),
('fuzhu', '辅助'),
)

role = models.CharField(verbose_name='角色', choices=role_choices, max_length=100, default='daye')

def __unicode__(self):
return self.name

class Meta:
db_table = u'Student'
verbose_name_plural = u'用户'
ordering = ('id',)

如果没有同步数据库的话记得先同步:

1
2
python3.5 manage.py makemigrations snippets
python3.5 manage.py migrate

2)Serializer

它的作用就是从你传入的参数中提取出你需要的数据,并把它转化为 json 格式,同时支持反序列化到model对象。在APP目录下添加serializers.py文件并如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from rest_framework import serializers
from demo.models import Student


# 第一种序列化方式
class StudentSerializer(serializers.Serializer):
id = serializers.CharField(read_only=True)
username = serializers.CharField(required=False)
password = serializers.CharField(required=False)
email = serializers.CharField(required=False) # 用于对浏览器的上的显示
have = serializers.CharField(required=False)

def create(self, validated_data):
"""
Create and return a new `Student` instance, given the validated data.
"""
return Student.objects.create(**validated_data)

def update(self, instance, validated_data):
"""
Update and return an existing `Student` instance, given the validated data.
"""
instance.id = validated_data.get('id', instance.id)
instance.username = validated_data.get('username', instance.username)
instance.password = validated_data.get('password', instance.password)
instance.email = validated_data.get('email', instance.email)
instance.have = validated_data.get('have', instance.have)
instance.save()
return instance


# 第二种序列化方式
class StSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Student
fields = ('id', 'username', 'password', 'email', 'have')

三、在Django的视图中使用Serializer

view.py中写一个函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from demo.models import Student
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
from demo.serializers import StudentSerializer,StSerializer


@csrf_exempt
def studentList(request):
"""
List all code snippets, or create a new snippet.
"""
if request.method == 'GET':
snippets = Student.objects.all()
serializer = StudentSerializer(snippets, many=True)
# serializer = StSerializer(snippets, many=True) # 一样的结果
return JsonResponse(serializer.data, safe=False)

elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = StudentSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)

四、添加url

urls.py中添加路径:

1
2
3
4
urlpatterns = [
...
url(r'^studentlist/$', views.studentList),
]

五、查看