Rest Api(1)

Rest表现层状态转化

是一种架构风格:

1.从资源角度来观察整个网络
2.每个URL代表一种资源
3.客户端通过四个http动词对后端进行操作

 准备工作

 

pip install djangorestframework
pip install markdown       # Markdown support for the browsable API.
pip install django-filter  # Filtering support

 

django项目setting中添加配置信息    'rest_framework'

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest',
    'rest_framework'
]

第一步:在RestApiurl中添加app的url地址

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/',include("rest.rest_urls")),
]

 在app  rest的url中添加一个url地址,这个url地址就会生成一个自带的web页面

from django.conf.urls import url,include


urlpatterns = [
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]

第二步:权限管理

在setting中添加

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
##如果你登录了.就可以进行增删改查,如果没有登录任何人只有只读权限
    ]
}

 第三步rest api视图注册

第一步:你需要把restapi  url 和django的url关联起来

url(r'^', include(router.urls)),

第二步:然后你注册一个api

router = routers.DefaultRouter()
router.register(r'users', UserViewSet)

第三步:写一个视图,视图里关联好你序列化的类

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    #serializer_class :交给UserSerializer类进行序列化
    serializer_class = UserSerializer

#定义显示表里的哪个字段
class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'is_staff')

----搞定了

 第四步:浏览器访问

第五步:登录创建数据

 

##如果你还要进行更多操作,点这些进去跟改就行

上面的操作,东西都是整合在了一起,实际上分开写最好了

进阶[多表查询]

目录最好分割开来

创建一个

  rest 视图

  rest序列化

  rest 路由

基本的创建API流程就是

1)创建你的序列化类

rest_serializers.py

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.Userprofile
        fields = ('name', 'email','status_type')

2)创建你的views 类

rest_views.py

class UserViewSet(viewsets.ModelViewSet):
    queryset = models.Userprofile.objects.all()
    #serializer_class :交给UserSerializer进行序列化
    serializer_class = UserSerializer

3)注册你的路由系统

rest_urls.py

router.register(r'users', UserViewSet)

完成!!

但是!!如果你遇到如下错误

 

 意思就是: 因为你的表中有外键,rest 会尝试把这个外键表展示出来,但是你缺没有定义好要展示manufactory(也就是关联的表!!!)这个表视图和序列化的类,所以就报错了!!

所以,这里就涉及到外键关联,关联几个外键  那你关联几个外键,就得都把对应的都展示出来!!!!!

记得按照三个步骤去添加你的rest api。。。 ['1:序列化类','2:视图类','3:路由类'] 保证不会出错

数据展示[多表展示]

当你访问数据的时候,数据展示中会有连接地址的存在. 

这时候你不想获得这样的数据,那你就需要在序列化类中修改继承类

例如:

class HostSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Hostname
        fields = ('ip','disk','cpu','kernel','species_type','role_type','source')

这样展示的就是完整的数据

[{"ip":"192.168.22.100","disk":"1024","cpu":"8","kernel":"centos6.5","species_type":1,"role_type":[],"source":1},{"ip":"192.168.11.22","disk":"1024","cpu":"12","kernel":"12","species_type":1,"role_type":[1],"source":3}]

但是,你的需求又提升了.不止想要这些简单的数据,还要关联表中的详细信息

你就需要这样写

[但是.层数越多,速度越慢!!两层就够了]

class HostSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Hostname
        depth = 2  #表示N层,就会展示N层
        fields = ('ip','disk','cpu','kernel','species_type','role_type','source')

实现效果如下

 

posted @ 2017-07-10 22:00  所有的梦想都画在墙上  阅读(219)  评论(0)    收藏  举报