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"), ]
访问效果图



浙公网安备 33010602011771号