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

原文地址:https://www.cnblogs.com/menkeyi/p/5897213.html