Django Rest Framwork实现RESTful API

安装

1
2
3
pip install djangorestframework
pip install markdown # Markdown为可视化 API 提供了支持
pip install django-filter

创建工程

工程名:restful
app名:api
IDE:PyCharm

配置rest_framework

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

"setting.py"



...

# Application definition

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

# 新增
'api',
'rest_framework',

)

# 新增
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',),
'PAGINATE_BY': 10
}
...

配置数据库

数据库采用mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

"setting.py"



DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'restful',
'USER': 'admin',
'PASSWORD': '123',
'HOST': '127.0.0.1',
'PORT': 3306,
}
}

建立模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
"models.py"

#coding:utf-8

from django.db import models

# Create your models here.

class User(models.Model):

GENDER_CHOICES = (
(1, "Male"),
(2, "Female")
)
name = models.CharField(max_length=60, blank=False, verbose_name='姓名')
birthday = models.DateField(blank=False)
gender = models.IntegerField(choices=GENDER_CHOICES)

def __unicode__(self):
return self.name + " ( " + str(self.birthday) + ")"

同步数据库

1
2
python manage.py makemigrations
python manage.py migrate

序列化

在api下新建serializers.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

"serializers.py"



#coding:utf-8
from rest_framework import serializers
from models import User, NumberologyInfo, OtherInfo

class UserSerializer(serializers.ModelSerializer):

class Meta:
model = User

fields = ('name', 'birthday', 'gender')

添加视图

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
"views.py"

#coding:utf-8

from django.shortcuts import render

# Create your views here.
from django.shortcuts import render

# Create your views here.
from rest_framework import viewsets
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.serializers import Serializer

from rest_framework import generics, permissions
from .models import User, NumberologyInfo
from .serializers import UserSerializer, NumberologyInfoSerializer

class UserViewSet(viewsets.ModelViewSet):
"""
允许查看和编辑user 的 API endpoint
"""
queryset = User.objects.all()
serializer_class = UserSerializer

创建视图的三种方式

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
37
38
39
40
41
"views.py"

# 第一种方式:APIView
class TaskList(APIView):

def get(self, request, format=None):
users = User.objects.all()
serializer = UserSerializer(users, many=True)
return Response(serializer.data)

def post(self, request, format=None):
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

# 第二种方式:通用视图 ListCreateAPIView
class TaskListCreate(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer


# 第三种方式:装饰器 api_view
@api_view(['GET', 'POST'])
def task_list(request):
'''
List all tasks, or create a new task.
'''
if request.method == 'GET':
tasks = User.objects.all()
serializer = UserSerializer(tasks, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

设置url

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
"urls.py"

#coding:utf-8
from django.conf.urls import patterns, url, include
from rest_framework import routers
from api import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)


# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browseable API.

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

#验证登录使用
url(r'auth',include('rest_framework.urls')),

]

启动服务

参考

1,django-rest-framework 系列教程(一)- Start Your API

2,Django RESTful API 设计指南

3,利用 Django REST framework 编写 RESTful API

4,用Django Rest Framework和AngularJS开始你的项目

5,Django Rest Framework 入门指南

6,django-rest-framework里的api请求频率控制

7, 验证和授权

Author: Binger Chen
Link: http://www.kekefund.com/2017/03/30/django-restful-framework/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.