前兩節(jié)介紹了從分析網(wǎng)頁源碼到爬取文章并將其保存在 MySQL 中的過程虏束,如有不明白的肩祥,請務(wù)必看完前幾節(jié)的介紹:
簡書 API 測試地址 : http://222.24.63.118:8080/
github 項目地址:https://github.com/strugglingyouth/jianshu/
本節(jié)將介紹 API 的生成
Django 有自己的 Django REST framework 框架可以直接生成 API蝠嘉,在 Django 中生成 API 從復(fù)雜到簡單有以下幾種方式:
使用 Serializer 編寫 API:使用 Serializer 類來編寫 API 視圖摊崭,這里我們不使用任何 REST framewrok 的其他特性忠荞,僅使用 Django 的常規(guī)方法編寫視圖钉稍。
使用基于函數(shù)視圖的
@api_view
重構(gòu)代碼:類視圖中的裝飾器提供了少許功能拾弃,比如確保在視圖中接收Request
實例烁设,添加context
到Resonse
對象來決定返回類型鄙早。使用類視圖重寫 API :更清晰的分離了 HTTP 的請求方法哨毁,將
method
封裝成了函數(shù)枫甲,不再需要使用if
進(jìn)行判斷。使用 Mixins 重構(gòu)代碼:
mixin
類則提供了list()
和ctreae()
等行為扼褪,會顯式綁定 GET 方法和 POST 方法對應(yīng)的功能想幻。使用類的通用視圖重構(gòu)代碼:讓代碼更簡潔。
使用 ViewSets 和 Routers 重構(gòu)代碼:REST framework 提供了一種叫做 ViewSets 的抽象行為话浇,它可以使開發(fā)人員聚焦于 API 的狀態(tài)和實現(xiàn)脏毯,通過使用 Router 類來自動生成 URL 配置信息。
我使用的是 ViewSets 和 Routers 的方法幔崖,當(dāng)然食店,這也是最常用的渣淤。以下是生成 API 的幾個步驟:
編寫 models:存儲數(shù)據(jù)使用的字段
編寫需要進(jìn)行序列化的字段:將字段序列化為 JSON 的形式輸出
編寫 views:對數(shù)據(jù)進(jìn)行的各種存取操作
編寫 URL:訪問 API 所使用的 URL
models 在上一節(jié)中已經(jīng)寫好,此處不再贅述吉嫩。
編寫需要進(jìn)行序列化的字段
在 jianshu
目錄下創(chuàng)建 serializers.py
文件,對應(yīng)的目錄結(jié)構(gòu)如下所示:
創(chuàng)建 serializers
和創(chuàng)建 Django 表單類似价认,Django 提供了 Form 類和 ModelForm 類,同樣的自娩,REST framework 提供了 Serializer 類和 ModelSerializer用踩。
#!/usr/bin/env python
# coding:utf-8
from models import ArticleList, ArticleDetail, HotArticle, SearchArticle
from rest_framework import serializers
class ArticleListSerializer(serializers.ModelSerializer):
"""
新上榜文章列表
"""
class Meta:
model = ArticleList
fields = ('article_id', 'article_title', 'article_url', 'article_user', 'article_user_url')
class ArticleDetailSerializer(serializers.ModelSerializer):
"""
新上榜文章詳細(xì)信息
"""
class Meta:
model = ArticleDetail
fields = ('image', 'title', 'body', 'time', 'views_count', 'public_comments_count', 'likes_count', 'total_rewards_count', 'article_abstract')
class HotArticleSerializer(serializers.ModelSerializer):
"""
熱門文章詳細(xì)信息
"""
class Meta:
model = HotArticle
fields = ('article_id', 'article_url', 'article_user', 'article_user_url', 'article_image', 'article_title', 'article_body', 'article_time', 'article_views_count', 'public_comments_count', 'article_likes_count', 'total_rewards_count' )
編寫 views
在 views 中使用 rest_framework 提供的 ViewSet 類,它提供了 read
以及 update
等操作忙迁。ViewSet 僅在被調(diào)用的時候才會和對應(yīng)的方法進(jìn)行綁定脐彩,當(dāng)它被實例化時通常是在使用 Route 類管理 URL 配置的時候。
#coding:utf-8
from rest_framework import viewsets
from jianshu.serializers import ArticleListSerializer, ArticleDetailSerializer, HotArticleSerializer, SearchArticleSerializer
from jianshu.models import ArticleList, ArticleDetail, HotArticle, SearchArticle
class ArticleListViewSet(viewsets.ReadOnlyModelViewSet):
"""
新上榜文章列表
"""
queryset = ArticleList.objects.all().order_by("-created")[:18]
serializer_class = ArticleListSerializer
class ArticleDetailViewSet(viewsets.ReadOnlyModelViewSet):
"""
新上榜文章詳細(xì)信息
"""
queryset = ArticleDetail.objects.all().order_by("-created")[:18]
serializer_class = ArticleDetailSerializer
class HotArticleViewSet(viewsets.ReadOnlyModelViewSet):
"""
熱門文章詳細(xì)信息
"""
queryset = HotArticle.objects.all().order_by("-created")[:18]
serializer_class = HotArticleSerializer
ReadOnlyModelViewSet 自動提供了“只讀”方法姊扔,然后按時間排序取出數(shù)據(jù)庫中相應(yīng)數(shù)量的文章惠奸。
編寫 URL
使用 Router 類可以自動生成 URL,我們需要做的僅僅是正確的注冊 View 到 Router 中:
from rest_framework.routers import DefaultRouter
from jianshu import views
router = DefaultRouter()
router.register(r'article_news_list', views.ArticleListViewSet)
router.register(r'article_news_detail', views.ArticleDetailViewSet)
router.register(r'hot_article', views.HotArticleViewSet)
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include(router.urls)),
]
測試
啟動服務(wù):
# python manage.py runserver 222.24.63.118:8080
在瀏覽器中訪問: