• Django Restframework 实践(一)


    具备以下知识:

    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

  • 相关阅读:
    lvs三种模式的优缺点对比
    linux下的$0-n作用
    图解 HTTP 笔记(一)——了解 Web 及网络基础
    从源码学习使用 node-delegates
    从源码看 Vue 中的 Mixin
    常见 Web 性能优化方式
    解密虚拟 DOM——snabbdom 核心源码解读
    浅谈 JSONP
    代码覆盖率测试及 GitHub 自动化集成
    Redis 学习笔记
  • 原文地址:https://www.cnblogs.com/menkeyi/p/5897213.html
Copyright © 2020-2023  润新知