本节内容

  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

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

Python Django rest framework的更多相关文章

  1. [python]django rest framework写POST和GET接口

    版本声明 python3.6.5 Django-2.0.6 djangorestframework-3.8.2 mysqlclient-1.3.12 1.写一个登录接口,不多说,直接上代码 login ...

  2. python 全栈开发,Day96(Django REST framework 视图,django logging配置,django-debug-toolbar使用指南)

    昨日内容回顾 1. Serializer(序列化) 1. ORM对应的query_set和ORM对象转换成JSON格式的数据 1. 在序列化类中定义自定义的字段:SerializerMethodFie ...

  3. python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)

    昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...

  4. 使用django rest framework

    django 刚接触,想做一些restful api , google了一下,发现有现成的框架.Django REST framework. 对使用做下记录: 安装 从http://django-re ...

  5. 利用 Django REST framework 编写 RESTful API

    利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framewor ...

  6. django rest framework 入门

    django rest framework 入门1-序列化 Serialization 分类: Python 2013-01-22 22:24 11528人阅读 评论(0) 收藏 举报 djangop ...

  7. django rest framework

    Django-Rest-Framework 教程: 4. 验证和权限 作者: Desmond Chen, 发布日期: 2014-06-01, 修改日期: 2014-06-02 到目前为止, 我们的AP ...

  8. Django REST Framework学习——Android使用REST方法访问Diango

    本文更应该叫做Android如何模拟浏览器访问Django服务器后台. 环境为: Android通过HttpClient访问服务器,从Django中获取json数据,解析显示在UI界面上. 问题为: ...

  9. Django REST FrameWork中文教程2:请求和响应

    从这一点开始,我们将真正开始覆盖REST框架的核心.我们来介绍几个基本的构建块. 请求对象REST框架引入了Request扩展常规的对象HttpRequest,并提供更灵活的请求解析.Request对 ...

随机推荐

  1. Java并发编程实战 之 线程安全性

    1.什么是线程安全性 当多个线程访问某个类时,不管运行时环境采用何种调用方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全 ...

  2. $(function(){})和window.onload的区别

    (1)$(function(){}):DOM节点创建 完成才执行 (2)window.onload:页面所有资源(JS/CSS)加载完成才执行

  3. Python基础学习篇章二

    一. Python如何运行程序 1. 在交互模式下编写代码 最简单的运行Python程序的方法是在Python交互命令行中输入程序.当然有很多方法可以开始这样的命令行,比如IDE,系统终端.如果你已经 ...

  4. js常用API方法

    String对象常用的API:API指应用程序编程接口,实际上就是一些提前预设好的方法. charAt() 方法可返回指定位置的字符. stringObject.charAt(index) index ...

  5. 深度学习之 mnist 手写数字识别

    深度学习之 mnist 手写数字识别 开始学习深度学习,先来一个手写数字的程序 import numpy as np import os import codecs import torch from ...

  6. Python-Cpython解释器支持的进程与线程-Day9

    Cpython解释器支持的进程与线程 阅读目录 一 python并发编程之多进程 1.1 multiprocessing模块介绍 1.2 Process类的介绍 1.3 Process类的使用 1.4 ...

  7. angular2 学习笔记 ( server-side rendering, angular universal, 服务端渲染 )

    更新 : 2018-01-10  大半年过去了依然没有做 server side render 的冲动,但是一直有关注这方便的做法. 今天领悟了一些道理, 这里做个记入. server side re ...

  8. 前端之HTML内容

    一.HTML介绍 1.Web服务本质 当我们在浏览器中输入一个url后打开一个页面这个过程实质是一个网络编程中的sockt服务端接受指令并发送指令的一个过程.本质顺序是: 浏览器发请求——>HT ...

  9. Android 6.0 以后webview不加载图片的问题

    /** * Webview在安卓5.0之前默认允许其加载混合网络协议内容 * 在安卓5.0之后,默认不允许加载http与https混合内容,需要设置webview允许其加载混合网络协议内容 */if ...

  10. Java面向对象之构造函数 入门实例

    一.基础概念 1.什么时候定义构造函数: 当对象创建时,需要对象必须具备的内容,通过构造函数完成. 2.一般函数和构造函数的区别: 定义上:构造函数只为对象的初始化,只执行一次.一般函数定义对象应该具 ...