Django之Restful API


理解Restful架構:http://www.ruanyifeng.com/blog/2011/09/restful
RESTful設計指南:http://www.ruanyifeng.com/blog/2014/05/restful_api.html
Django REST framework文檔:http://www.django-rest-framework.org/#installation
Django RESTful 中文翻譯:http://blog.csdn.net/ppppfly/article/category/6170709

基於Django的RESTful安裝

第一步:使用pip安裝:

pip install djangorestframework

第二步:添加rest_framework到settings中的INSTALLED_APPS中:

INSTALLED_APPS = ( ... 'rest_framework', )

如果你需要使用瀏覽器API,需要添加REST framework的登錄注銷模塊,需要將下面的代碼添加到urls.py中:

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

注意:URL路徑可以任意編寫,但你必須include 'rest_framework.urls',且使用'rest_framework'這個namespace(命名空間)。如果你的Django是1.9+版本,你也可以不寫namespace,REST framework會幫你自動設置。

例子

讓我們看一個簡單用例:如何用REST framework 來搭建一個簡單的支持modle的API。

我們將創建一個讀/寫API,來處理我們項目中的用戶信息。

任何REST framework的全局設置,都存放在一個配置字典(dictionary,有些語言如Java中的map)中,名為REST_FRAMEWORK。我們從以下的操作開始,把下面的內容添加到你的settings.py模塊中:

REST_FRAMEWORK = {
    # 使用Django的標准`django.contrib.auth`權限管理類,
    # 或者為尚未認證的用戶,賦予只讀權限.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ]
}

別忘了,確保你已經將 rest_framework 添加到你的INSTALLED_APPS中。

現在我們已做好准備,來創建我們的API了。這是我們的項目根下urls.py模塊:

from django.conf.urls import url, include
from django.contrib.auth.models import User
from rest_framework import routers, serializers, viewsets

# Serializers定義了API的表現形式.
class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'is_staff')

# ViewSets 定義了 視圖(view) 的行為.
class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

# Routers 提供了一種簡單途徑,自動地配置了URL。
router = routers.DefaultRouter()
router.register(r'users', UserViewSet)

# 使用自動的URL路由,讓我們的API跑起來。
# 此外,我們也包括了登入可視化API的URLs。
urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

現在你可以在瀏覽器的http://127.0.0.1:8000/里,打開你新建的’users’ API了。使用右上角的登陸控制,可以對系統用戶進行新增和刪除操作

rest_searializer.py:

from django.conf.urls import url, include
#從已存在的assets項目中導入數據models模塊
from assets import models
from rest_framework import routers,serializers,viewsets

#定義一個表現形式
class UserSerializer(serializers.ModelSeriallizer):
    class Meta:
        model = models.UserProfile
        fields = ('username','name','token','email','is_staff')
        
class AssetSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Asset   
        ...
from rest_framework import viewsets
from assets import models
from assets import rest_searializer

class UserViewSet(viewsets.ModelViewSet):
    queryset = models.UserProfile.objects.all()
    serializer_class = rest_searializer.UserSerializer

class AssetViewSet(viewsets.ModelViewSet): 
    queryset = models.Asset.objects.all()
    serializer_class = rest_searializer.AssetSerializer

rest_urls.py:

from rest_framework import routers
from django.conf.urls import url,include
from assets import rest_viewset

router = routers.DefaultRouter()
router.register(r'users',rest_viewset.UserViewSet)
router.register(r'assets',rest_viewset.AssetViewSet)
router.register(r'manufactory',rest_viewset.ManufactoryViewSet)
router.register(r'business_unit',rest_viewset.BusinessUnitViewSet)

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

settings.py:

REST_FRAMEWORK = {
    # 使用Django的標准`django.contrib.auth`權限管理類,
    # 或者為尚未認證的用戶,賦予只讀權限.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ]
}

使用API插入數據的例子,views.py中:

def api_test(request):
    if request.method =="GET":
        return render(request,"test_post.html")
    else:
        data = json.loads(request.POST.get("data"))
        print("--->",data)
        rest_obj = rest_searializer.AssetSerializer(data=data,many=True)
        if rest_obj.is_valid():
            rest_obj.save()
        return render(request,"test_post.html",{"errors":rest_obj.errors,"data":rest_obj.data})

其中many=true,是將queryset多對多序列化,詳細參數后面會有表述.

dss.Serializer 提供序列器

function serializer(data, datetime_format='timestamp', output_type='raw', include_attr=None, except_attr=None, foreign=False, many=False)

Parameters:

data(Required|(QuerySet, Page, list, django model object))-待處理數據
datetime_format(Optional|string)-如果包含 datetime 將 datetime 轉換成相應格式.默認為 "timestamp"(時間戳)
output_type(Optional|string)-serialize type. 默認“ raw ”原始數據,即返回 list 或 dict
include_attr(Optional|(list, tuple))-只序列化 include_attr 列表里的字段。默認為 None
exclude_attr(Optional|(list, tuple))-不序列化 except_attr 列表里的字段。默認為 None
foreign(Optional|bool)-是否序列化 ForeignKeyField 。 include_attr 與 exclude_attr 對 ForeignKeyField 依舊有效。 默認為 False
many(Optional|bool)-是否序列化 ManyToManyField 。 include_attr 與 exclude_attr 對 ManyToManyField 依舊有效 默認為 False


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM