具备以下知识:
django
http://www.cnblogs.com/menkeyi/p/5882464.html
http://www.cnblogs.com/menkeyi/p/5882453.html
安装Django Restframework
官方网站
http://www.django-rest-framework.org/
安装方法
pip install djangorestframework
pip install markdown # Markdown support for the browsable API.
pip install django-filter # Filtering support
加入app
在最后一行增加以下内容:允许未认证的用户只读权限
1 REST_FRAMEWORK = { 2 # Use Django's standard `django.contrib.auth` permissions, 3 # or allow read-only access for unauthenticated users. 4 'DEFAULT_PERMISSION_CLASSES': [ 5 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' 6 ] 7 }
创建用户测试一下看看返回值和内容有什么变化
按照api规范 http://localhost/api/users/1 这样就可以查看具体的1(资源)用户,http://localhost/api/users 查看所有用户
接下来看看它是如何实现的:
先看url
from django.conf.urls import include, url from django.contrib import admin #导入rest_urls from assets import rest_urls,urls as asset_urls import views #根据url(r'^api/',include(rest_urls)),找到api的url入口文件rest_urls urlpatterns = [ url(r'^admin/', include(admin.site.urls)), url(r'^api/',include(rest_urls)), url(r'asset/',include(asset_urls)), url(r'^$',views.index,name="dashboard"), url(r'^login/$',views.acc_login,name='login'), ]
在接着查看rest_urls文件
#_*_coding:utf-8_*_ from django.conf.urls import url, include #导入routers方法 from rest_framework import routers import rest_views as views #这个是rest_framework封装django 的routers router = routers.DefaultRouter() #注册一下,然后关联后面视图 router.register(r'users', views.UserViewSet) router.register(r'assets', views.AssetViewSet) router.register(r'servers', views.ServerViewSet) # Wire up our API using automatic URL routing. # Additionally, we include login URLs for the browsable API. #注意看这里 :url(r'^', include(router.urls)) #所有以localhost/api 开头的都去找router.urls # urlpatterns = [ url(r'^', include(router.urls)), url(r'^asset_list/$',views.AssetList ), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) ]
先看一下views.UserViewSet
#_*_coding:utf-8_*_ import myauth from rest_framework import viewsets from serializers import UserSerializer, AssetSerializer,ServerSerializer from rest_framework import status from rest_framework import permissions from rest_framework.decorators import api_view,permission_classes from rest_framework.response import Response import models #这个跟django的类方法可不一样 以前都是self,现在是一个viewsets.ModelViewSet 类方法 class UserViewSet(viewsets.ModelViewSet): """ API endpoint that allows users to be viewed or edited. """ #查询用户信息myauth.UserProfile.objects.all().order_by('-date_joined') #queryset,serializer_class 这个变量名是死的不能改 queryset = myauth.UserProfile.objects.all().order_by('-date_joined') #UserSerializer 序列化(表现层,将数据按照一定格式来处理然后返回给前端) serializer_class = UserSerializer
看看UserSerializer是什么东西(这个是自己写的)
#_*_coding:utf-8_*_ from myauth import UserProfile #导入表结构 import models #导入rest_framework的serializers方法 from rest_framework import serializers #继承serializers.HyperlinkedModelSerializer超链接方法,看页面都是用链接操作的 class UserSerializer(serializers.HyperlinkedModelSerializer): #实际这里也对数据进行了验证,但这个认证是由UserProfile表结构来完成。api中没有定义这个验证 class Meta: #选择对应的表 model = UserProfile #定义处理UserProfile表中的字段。序列化这些字段。这里只处理UserProfile表的数据,如果传递来的是其它表数据那么对不起 这里会报错 fields = ('url', 'name', 'email','is_admin') class AssetSerializer(serializers.ModelSerializer): class Meta: model = models.Asset #深度查询等级,资产表是被server表关联的。当查询资产表的时候其实也可以直接查询跟它关联的表。 #depth就是这个作用,当然最好这里别的太深。默认查询0层 depth=2 fields = ('name', 'sn','server','networkdevice') class ServerSerializer(serializers.ModelSerializer): class Meta: model = models.Server #fields = ('name', 'sn','server')
所有流程就完毕了 ,总结下流程。
演示下深度查询的作用:
现在暂时没有数据这里
增加一些数据,先把depth改成0
增加一些数据,先把depth改成1