
前兩節(jié)介紹了從分析網(wǎng)頁源碼到爬取文章并將其保存在 MySQL 中的過程,如有不明白的,請務必看完前幾節(jié)的介紹:
簡書 API 測試地址 : http://222.24.63.118:8080/
github 項目地址:https://github.com/strugglingyouth/jianshu/
本節(jié)將介紹 API 的生成
Django 有自己的 Django REST framework 框架可以直接生成 API,在 Django 中生成 API 從復雜到簡單有以下幾種方式:
使用 Serializer 編寫 API:使用 Serializer 類來編寫 API 視圖,這里我們不使用任何 REST framewrok 的其他特性,僅使用 Django 的常規(guī)方法編寫視圖。
使用基于函數(shù)視圖的
@api_view重構代碼:類視圖中的裝飾器提供了少許功能,比如確保在視圖中接收Request實例,添加context到Resonse對象來決定返回類型。使用類視圖重寫 API :更清晰的分離了 HTTP 的請求方法,將
method封裝成了函數(shù),不再需要使用if進行判斷。使用 Mixins 重構代碼:
mixin類則提供了list()和ctreae()等行為,會顯式綁定 GET 方法和 POST 方法對應的功能。使用類的通用視圖重構代碼:讓代碼更簡潔。
使用 ViewSets 和 Routers 重構代碼:REST framework 提供了一種叫做 ViewSets 的抽象行為,它可以使開發(fā)人員聚焦于 API 的狀態(tài)和實現(xiàn),通過使用 Router 類來自動生成 URL 配置信息。
我使用的是 ViewSets 和 Routers 的方法,當然,這也是最常用的。以下是生成 API 的幾個步驟:
編寫 models:存儲數(shù)據(jù)使用的字段
編寫需要進行序列化的字段:將字段序列化為 JSON 的形式輸出
編寫 views:對數(shù)據(jù)進行的各種存取操作
編寫 URL:訪問 API 所使用的 URL
models 在上一節(jié)中已經(jīng)寫好,此處不再贅述。
編寫需要進行序列化的字段
在 jianshu 目錄下創(chuàng)建 serializers.py 文件,對應的目錄結構如下所示:

創(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):
"""
新上榜文章詳細信息
"""
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):
"""
熱門文章詳細信息
"""
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 僅在被調用的時候才會和對應的方法進行綁定,當它被實例化時通常是在使用 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):
"""
新上榜文章詳細信息
"""
queryset = ArticleDetail.objects.all().order_by("-created")[:18]
serializer_class = ArticleDetailSerializer
class HotArticleViewSet(viewsets.ReadOnlyModelViewSet):
"""
熱門文章詳細信息
"""
queryset = HotArticle.objects.all().order_by("-created")[:18]
serializer_class = HotArticleSerializer
ReadOnlyModelViewSet 自動提供了“只讀”方法,然后按時間排序取出數(shù)據(jù)庫中相應數(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)),
]
測試
啟動服務:
# python manage.py runserver 222.24.63.118:8080
在瀏覽器中訪問:
