django rest-api 安装配置及查询操作(包含自动路由)

安装及配置

官网(需要注意所使用的python和django的版本)

http://www.django-rest-framework.org/#installation

 

安装相关模块

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple djangorestframework

 

settings.py

INSTALLED_APPS = (
    ...
    'rest_framework',
)

#添加(用作权限控制)
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
#'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',  #忽略权限问题可直接访问
     'rest_framework.permissions.IsAdminUser',    #浏览器只有登陆的时候才能访问,否则会报权限错误
  ]
}

 bash访问方式

http -a admin:password123 http://127.0.0.1:8000/cmdb/api/

 

api调用流程

  • client 从url路由系统开始访问url,
  • url调用router去api相应的views(视图)里找相应的类,
  • 视图函数里的类从数据库查询所需要的信息,然后交给class类进行序列化,最后返回给client。

 

单表查询

示例(api所需要的文件可以全部写到一个文件下):

cmdb(app)
  ├── admin.py   ├── apps.py   ├── core.py   ├──
__init__.py   ├── models.py           #数据库models   ├── rest_serialize.py      #api所需要的序列化文件(自定义)   ├── rest_views.py        #api所需要的视图文件(自定义)   ├── tests.py   ├── urls.py            #api入口文件   └── views.py

 

cmdb/urls.py

from django.conf.urls import url,include
from cmdb import views
from rest_framework import routers            #导入相关模块
from cmdb import rest_views


#自动路由 router
= routers.DefaultRouter() router.register(r'users',rest_views.AssetViewSet)      #这里的users为相应的url(ip/api/users/),AssetViewSet为rest_views下的类 #api流程:用户从url这里开始进来,去router里找rest_views里的类,查询所有所需要的信息,然后交给class进行序列化,将结果返回给用户 urlpatterns = [ url(r'api/',include(router.urls)), #api相关的url,自动去router里去找url url(r'report/$', views.asset_report, name='asset_report'), url(r'report/asset_with_no_asset_id/$', views.asset_with_no_asset_id), url(r'^new_assets/approval/$', views.new_assets_approval, name="new_assets_approval"), ]

 

api视图函数rest_views.py

#!/usr/bin/env python
#-*-coding:utf-8-*-

from rest_framework import viewsets
from cmdb import models
from cmdb.rest_serialize import CmdbSerializer

class AssetViewSet(viewsets.ModelViewSet):
    queryset = models.Asset.objects.all()                   #固定字段,Asset为models下的表名,默认查询所有数据
    serializer_class = CmdbSerializer                       #固定字段


序列化函数rest_serialize.py

#!/usr/bin/env python
#-*-coding:utf-8-*-

from rest_framework import serializers
from cmdb import models

class CmdbSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = models.Asset    #表名
        fields =('sn','name','status','asset_type','id')     #这几个字段要在上面的Asset表里存在,需要什么字段在这里添加即可

 

启动django访问

 

如果想访问某个id的信息

 

 以json形式显示

 

多表查询

在rest_serialize.py文件中修改

#!/usr/bin/env python
#-*-coding:utf-8-*-

from rest_framework import serializers
from cmdb import  models

class IDCSerializer(serializers.ModelSerializer):    #同下
    class Meta:
        model = models.IDC
        fields =('name',)

class UserProfileSerializer(serializers.ModelSerializer):      #要显示该表的数据,需要查询并序列化给client
    class Meta:
        model = models.UserProfile
        fields =('email','name')

class CmdbSerializer(serializers.ModelSerializer):     #如果此处继承别的类(HyperlinkeModelSerizlizer类),在/api/asset/ url里查询的结果,此处显示为一个连接,而非实际的值
    class Meta:
        model = models.Asset
        depth = 2            #这里表示显示的时候显示到数据里第二层的值(查询出的结果为json,第二层为字典里面的值)
        fields =('sn','name','status','asset_type','create_date','id','admin','idc')    ##跨表查询时,需要将关联的表名的字段写到这里(admin和idc字段在asset表中存在,并且为asset表在关联admin表和idc表的外键

 

相应的需要在视图文件rest_views里定义

#!/usr/bin/env python
#-*-coding:utf-8-*-

from rest_framework import viewsets
from cmdb import models
from cmdb.rest_serialize import CmdbSerializer,IDCSerializer,UserProfileSerializer    #导入定义的类


class AssetViewSet(viewsets.ModelViewSet):
    queryset = models.Asset.objects.all()                   #固定字段,查询所有数据
    serializer_class = CmdbSerializer                       #固定字段,值由rest_serialize定义并引入,进行序列化操作

class IDCViewSet(viewsets.ModelViewSet):
    queryset = models.IDC.objects.all()                   #固定字段
    serializer_class = IDCSerializer                       #固定字段,值由rest_serialize定义并引入

class UserProfileViewSet(viewsets.ModelViewSet):
    queryset = models.UserProfile.objects.all()                   #固定字段
    serializer_class = UserProfileSerializer                       #固定字段,值由rest_serialize定义并引入

 

路由urls

from django.conf.urls import url,include
from cmdb import views
from rest_framework import routers
from cmdb import rest_views

router = routers.DefaultRouter()
router.register(r'assets',rest_views.AssetViewSet)
router.register(r'idcs',rest_views.IDCViewSet)          #多表查询同样需要register
router.register(r'users',rest_views.UserProfileViewSet)


#api流程:用户从url这里开始进来,去router里找rest_views里的类,查询所有所需要的信息,然后交给class进行序列化,将结果返回给用户

urlpatterns = [
    url(r'api/',include(router.urls)),       #自动去router里去找url
    url(r'report/$', views.asset_report, name='asset_report'),
    url(r'report/asset_with_no_asset_id/$', views.asset_with_no_asset_id),
    url(r'^new_assets/approval/$', views.new_assets_approval, name="new_assets_approval"),

]

 

访问效果图

 

 

posted @ 2018-05-25 10:53  FRESHMANS  阅读(569)  评论(0)    收藏  举报