Python Django rest framework

本节内容

  1. Django rest framework 安装

  2. Django rest framwwork 环境配置

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

1.1 安装 Django rest framework

建立新的环境    可以忽略

virtualenv env
source env/bin/activate

安装 djangorestframework 模块

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’

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

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

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

在app01的urls.py中写如下内容

#!/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

 

 自己测得玩玩就好, 这只是个入门。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值