Django Rest framework

此篇幅中止更新,將替換爲DRF擴展使用方式,敬請期待 ~ python

快速上手

Django REST framework 是用於構建Web API 的強大而靈活的工具包。git

咱們可能想使用REST框架的一些緣由:github

  • Web瀏覽API對於開發人員來講是一個巨大的可用性。
  • 認證策略包括OAuth1a和OAuth2的包。
  • 支持ORM和非ORM數據源的序列化。

安裝需求以及安裝及使用django

REST framework 兼容版本:api

  • Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6)
  • Django (1.8, 1.9, 1.10, 1.11)

 安裝
瀏覽器

# 若是使用的是python3

pip3 install djangorestframework
pip3 install markdown   
pip3 install django-filter 

# 或者經過github安裝

git clone git@github.com:encode/django-rest-framework.git

使用markdown

# 添加 "rest_framework" 到Django settings.py文件中INSTALLED_APPS,

INSTALLED_APPS = (
    ...
    'rest_framework',
)

# 若是打算使用可瀏覽的API。還須要添加REST framework的登陸和註銷視圖。將如下內容添加到根url.py文件中,命名空間必須保留,路由能夠設置爲本身想要的。

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

接下來,能夠舉個例子app

REST framework API的任何全局設置都保存在一個名爲restframework的配置字典中。首先在設置中添加如下內容框架

REST_FRAMEWORK = {
    # 使用Django的 `django.contrib.auth` 權限驗證,
    # 或者容許對未經身份驗證的用戶進行只讀訪問.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ]
}
# 別忘記在 installedapps上添加了restframework。
# 如今已經準備好建立API了。這是項目的根 url.py 模塊

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

# 序列化model模型展現.
class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'is_staff')

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

# 路由器提供一種簡單的方法來自動肯定URL的設置(使用註冊的方式).
router = routers.DefaultRouter()
router.register(r'users', UserViewSet)

# 使用自動URL路由鏈接API.
# 此外,還包括可瀏覽的API的登陸url.
urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

如今,能夠在瀏覽器中打開該API,http://127.0.0.1:8000/,並查看新的「用戶」API。若是你在右上角使用登錄控制也能夠從系統中添加,建立和刪除用戶。工具

REST framework組件詳解

接下來了解下rest framework 的全部組件,而且得知它們是如何組合在一塊兒的,這是很是值得去學習的。

  • 1 - Serialization 序列化
  • 2 - Requests & Responses 請求 & 響應
  • 3 - Class-based views 基於類的視圖
  • 4 - Authentication & permissions 身份驗證 & 權限
  • 5 - Relationships & hyperlinked APIs
  • 6 - Viewsets & routers 視圖和路由
  • 7 - Schemas & client libraries 模式和客戶端庫(虛位以待~)

1、Serialization 序列化

 這裏呢,不對普通的序列化做介紹。接下來咱們使用下 ModelSerializers

model序列化讓咱們寫的代碼更少,更簡介。Django提供了form和modelform同樣,REST框架包括了序列化器類和模型序列化器類。

例如 models 文件中有一個關於文章的表 

class Article(models.Model):
    """文章資訊"""
    title = models.CharField(max_length=255, unique=True, db_index=True, verbose_name="標題")
    source = models.ForeignKey("ArticleSource", verbose_name="來源")
    article_type_choices = ((0, '資訊'), (1, '視頻'))
    article_type = models.SmallIntegerField(choices=article_type_choices, default=0)
    brief = models.TextField(max_length=512, verbose_name="摘要")
    head_img = models.CharField(max_length=255)
    content = models.TextField(verbose_name="文章正文")
    pub_date = models.DateTimeField(verbose_name="上架日期")
    offline_date = models.DateTimeField(verbose_name="下架日期")
    status_choices = ((0, '在線'), (1, '下線'))
    status = models.SmallIntegerField(choices=status_choices, default=0, verbose_name="狀態")
    order = models.SmallIntegerField(default=0, verbose_name="權重", help_text="文章想置頂,能夠把數字調大")
    comment_num = models.SmallIntegerField(default=0, verbose_name="評論數")
    agree_num = models.SmallIntegerField(default=0, verbose_name="點贊數")
    view_num = models.SmallIntegerField(default=0, verbose_name="觀看數")
    collect_num = models.SmallIntegerField(default=0, verbose_name="收藏數")

    tags = models.ManyToManyField("Tags", blank=True, verbose_name="標籤")
    date = models.DateTimeField(auto_now_add=True, verbose_name="建立日期")

    def __str__(self):
        return "%s-%s" % (self.source, self.title)

接下來,只須要寫一個序列化器,即可以輕鬆對數據的進行獲取,並且代碼看起來特別簡潔。

# 在 serilallzer.py 文件能夠這樣寫
# 若是想使用哪一個model進行序列化,照此類推便可
# fields 若是想要獲取全部字段, 使用"__all__"  
# fields 若是隻是想要獲取一部分數據呢, 那麼在 fields 中加入所序列化的model的字段便可

from rest_framework.serializers import ModelSerializer


class ArticleSerializer(ModelSerializer):
    class Meta:
        model = models.Article
        fields = ("id", "title", "article_type", "content", ) or "__all__"

2、Requests & Response (請求 & 響應 )

更新中...

3、Class-based views 基於類的視圖

可使用基於類的視圖編寫API,而且能夠重用不少公共的功能,並幫助保持代碼的可重用性。

rest_framework封裝原有django的CBV模式下的View,提供了更高級的接口使用。

# 它們一共五層view視圖封裝, 結構以下(這裏統籌了API, 並不只僅有這些接口類, 還有更多的細化 )

from django.views import View
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from rest_framework.viewsets import GenericViewSet
from rest_framework.viewsets import ModelViewSet

 那麼接下來寫請求視圖類,即可以對應符合對應本身視圖方法來繼承它們, e.g

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authentication, permissions
from django.contrib.auth.models import User

class ListUsers(APIView):
    # API策略屬性
    authentication_classes = ()  # 認證(用戶是否須要登錄認證, )
    permission_classes = ()  # 權限
    renderer_classes = ()  # 返回渲染器
    parser_classes = ()  # 解析器
    throttle_classes = ()  # 節流檢查器
    content_negotiation_class = ()  # 內容協商器
相關文章
相關標籤/搜索