Python Django rest framework

本节内容

  1. Django rest framework 安装python

  2. Django rest framwwork 环境配置数据库

  3. 简单举例说明
  4. Django中使用 rest frameworkdjango

1.1 安装 Django rest framework

创建新的环境    能够忽略api

virtualenv env
source env/bin/activate

安装 djangorestframework 模块markdown

pip install django
pip install djangorestframework
pip install markdown # Markdown support for the browsable API.
pip install django-filter # Filtering support

2 Django rest framework 环境配置

1.配置settings文件

在项目配置文件settings的INSTALLED_APPS中添加 ‘rest_framework’app

在settings最后一行增长一下内容:容许未认证的用户只读权限ide

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ]
}

3 简单的举例说明

先来看下我Django项目的目录结构函数

 

第一步咱们须要在 crm_1的 urls下添加 rest framework 的指向信息,这里咱们把api的请求指向到app01下的urls.pyurl

urlpatterns = [
    url(r'^api/',include('app01.urls') ),
]

在app01的urls.py中写以下内容spa

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = '40kuai'

from django.conf.urls import url, include
from django.contrib.auth.models import User
from rest_framework import routers, serializers, viewsets


# Serializers define the API representation.
class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'is_staff')


# ViewSets define the view behavior.
class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer


# Routers provide an easy way of automatically determining the URL conf.
router = routers.DefaultRouter()
router.register(r'users', UserViewSet)

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls',namespace='rest_framework'))
]

配置了这些以后你就能够启动你的Django项目而且来访问api,

python manage makemigrations
python manage migrate
python manage createsuperuser  # 建立第一个用户数据方便在api中查看信息

页面显示

登陆后能够查看和编辑数据

下面咱们来建立两个有关联关系的表。来看看api怎么显示。

先来建立两个表, 一个角色表。一个菜单表,一个角色能够后多个菜单

from django.db import models

# Create your models here.

class Role(models.Model):
    """角色表"""
    name = models.CharField(max_length=64,unique=True)
    menus = models.ManyToManyField("Menu",blank=True,null=True)

    def __str__(self):
        return self.name


class Menu(models.Model):
    """一级菜单"""
    name = models.CharField(max_length=64)
    url_type_choices = ((0,'absolute'),(1,'relative'))
    url_type =  models.PositiveIntegerField(choices=url_type_choices,default=1)
    url_string = models.CharField(max_length=128)
    order = models.SmallIntegerField(default=0)

    def __str__(self):
        return self.name

    class Meta:
        unique_together = ("url_string",'url_type')
models.py

 

在admin.py中注册下, 咱们经过Django admin来添加几条数据

from app01 import models


admin.site.register(models.Menu)
admin.site.register(models.Role)
admin.py

 

建立完成后表中的数据

Roles

Menus

下面根据上面实例的配置来先配置Role表,让表Role经过api来显示,而且把各个处理的方法单独分开

先只配置了Role表,来看看效果

在你要显示的表中存在关联关系的时候,须要给关联表也作相应配置

完整的配置   app01目录下的配置

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = '40kuai'

from django.conf.urls import url, include
from app01 import rest_routers

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    url(r'^', include(rest_routers.router.urls)),
    url(r'^api-auth/', include('rest_framework.urls',namespace='rest_framework'))
]
urls.py

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = '40kuai'

from rest_framework import routers
from app01.rest_viewsets import *
"""
负责对url进行绑定
相似与Django admin的注册
"""

router = routers.DefaultRouter()
router.register(r'role', RoleViewSet)
router.register(r'menu', MenuViewSet)
rest_routers.py

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = '40kuai'
from rest_framework import viewsets
from app01.rest_serializers import *
from app01 import models
"""
把数据库中的数据取出来,交给序列化进行处理
相似Django中的的视图函数
"""
class RoleViewSet(viewsets.ModelViewSet):
    queryset = models.Role.objects.all()
    serializer_class = RoleSerializer

class MenuViewSet(viewsets.ModelViewSet):
    queryset = models.Menu.objects.all()
    serializer_class = MenuSerializer
rest_viewsets.py  

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = '40kuai'

from rest_framework import serializers
from app01 import models
"""
序列化要展现的数据
"""
class RoleSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        # depth = 1  # 展现的深度
        model = models.Role
        fields = ('url','name', 'menus', )

class MenuSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.Menu
        fields = ('url','name', 'url_type','url_string','order' )
rest_serializers.py

 

如今页面就能够正常访问了。  

显示关联表里的详细信息:

serializers 类的配置的class Meta中添加   depth = 2 来指定 数据查询的深度

serializers.HyperlinkedModelSerializer   # 显示对象的url
ModelSerializer  # 显示对象的id

4 Django 视图函数和rest framework 结合使用

# 接口新加两条路由信息
    url(r'^eventlog_list/', views.eventrole_list),
    url(r'^eventlog_detail/(\d+)/', views.eventrole_detail),
from django.shortcuts import render

# Create your views here.
from rest_framework import serializers
from app01 import models

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 rest_framework.decorators import api_view

from rest_framework import status
from rest_framework.response import Response


class EventRoleSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Role
        fields = ('id','name', 'menus')


@api_view(['GET', 'POST'])
def eventrole_list(request):
    """
    List all snippets, or create a new snippet.
    """
    if request.method == 'GET':
        eventroles = models.Role.objects.all()
        serializer = EventRoleSerializer(eventroles, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        print("request", request.data)
        serializer = EventRoleSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET', 'POST','PUT','DELETE'])
@csrf_exempt
def eventrole_detail(request, pk):
    """
    Retrieve, update or delete a code eventlog.
    """
    try:
        eventrole_obj = models.Role.objects.get(pk=pk)
    except models.Role.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'GET':
        serializer = EventRoleSerializer(eventrole_obj)
        return JsonResponse(serializer.data)

    elif request.method == 'PUT':
        print(request)
        data = JSONParser().parse(request)
        serializer = EventRoleSerializer(eventrole_obj, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)

    elif request.method == 'DELETE':
        eventrole_obj.delete()
        return HttpResponse(status=204)
views.py

 

 本身测得玩玩就好, 这只是个入门。

相关文章
相关标签/搜索