使用Django Rest framework搭建Blog

来源:https://www.cnblogs.com/magicduan/archive/2023/04/19/17333776.html
-Advertisement-
Play Games

在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處於上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ...


在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處於上升趨勢,但是Rest API還是使用的更廣泛一些.

所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Quick Start將前面的Blog的例子用DRF(Django Rest Framework)重新構築一遍.

搭建Blog的rest api server

創建Blog Django project

安裝DRF(Django Rest Framework)

pip install djangorestframework

創建Blog Project

django-admin startproject drf_backend
cd drf_backend
django-admin startapp blog
cd ..
python manage.py migrate #創建預設的sqlite資料庫
python manage.py createsuperuser #創建super user
python manage.py runserver #啟動服務

上述操作後可以進入http://127.0.0.1:8000/admin 查看服務

創建Blog Models

參考前面Blog的代碼在models.py加入 Post, Tag, Profile的Model代碼

在admin.py中加入預設的管理頁面, 

blog/models.py

from django.db import models
from django.conf import settings

# Create your models here.

class Profile(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.PROTECT,
    )
    website = models.URLField(blank=True)
    bio = models.CharField(max_length=240, blank=True)

    def __str__(self):
        return self.user.get_username()

class Tag(models.Model):
    name = models.CharField(max_length=50, unique=True)

    def __str__(self):
        return self.name

class Post(models.Model):
    class Meta:
        ordering = ["-publish_date"]

    title = models.CharField(max_length=255, unique=True)
    subtitle = models.CharField(max_length=255, blank=True)
    slug = models.SlugField(max_length=255, unique=True)
    body = models.TextField()
    meta_description = models.CharField(max_length=150, blank=True)
    date_created = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)
    publish_date = models.DateTimeField(blank=True, null=True)
    published = models.BooleanField(default=False)

    author = models.ForeignKey(Profile, on_delete=models.PROTECT)
    tags = models.ManyToManyField(Tag, blank=True)   

blog/admin.py

from django.contrib import admin
from blog.models import Profile, Post, Tag

# Register your models here.
@admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):
    model = Profile

@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
    model = Tag

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    model = Post

    list_display = (
        "id",
        "title",
        "subtitle",
        "slug",
        "publish_date",
        "published",
    )
    list_filter = (
        "published",
        "publish_date",
    )
    list_editable = (
        "title",
        "subtitle",
        "slug",
        "publish_date",
        "published",
    )
    search_fields = (
        "title",
        "subtitle",
        "slug",
        "body",
    )
    prepopulated_fields = {
        "slug": (
            "title",
            "subtitle",
        )
    }
    date_hierarchy = "publish_date"
    save_on_top = True

構造資料庫

python manage.py makemigrations
python manage.py migrate

數據Serializers

創建 blog/serializers.py, 這裡我們使用HyperlinkedModelSerializer 類, 也可以使用ModelSerializer. 這兩者的區別在於HyperLinkedModelSerializer將id直接變成url形式,這樣可以不用在代碼中再構造url.

from blog.models import Post,Tag,Profile
from django.contrib.auth.models import User
from rest_framework import serializers

class PostSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Post
        fields = ['url','title','subtitle','slug','body','meta_description','date_created','publish_date','published','author','tags']

class TagSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Tag
        fields = ['url','name']

class ProfileSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Profile
        fields = ['url','profile_pic','bio','user']

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ['url','username','email','password']

Views

對應的rest api的請求,我們在blog/views.py中加入相關的處理 

from django.shortcuts import render
from django.contrib.auth.models import User
from blog.models import Post,Tag,Profile
from rest_framework import  viewsets,permissions
from blog.serializers import PostSerializer,TagSerializer,ProfileSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all().order_by('publish_date')
    serializer_class = PostSerializer
#    permission_classes = [permissions.IsAuthenticated]


class TagViewSet(viewsets.ModelViewSet):
    queryset = Tag.objects.all()
    serializer_class = TagSerializer


class ProfileViewSet(viewsets.ModelViewSet):
    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer

*註意我們這裡先不使用permission_classes,如果使用的話,在瀏覽器上就必須Login才能取得對應的數據

配置URL

在drf_backend/urls.py加入下列代碼

from django.contrib import admin
from django.urls import path,include
from rest_framework import routers
from blog import views

router =routers.DefaultRouter()
router.register(r'posts', views.PostViewSet)
router.register(r'tags',views.TagViewSet)
router.register(r'profile', views.ProfileViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

配置drf_backend/settings/py

INSTALLED_APPS
INSTALLED_APPS = [
    ...
    "corsheaders",
    'rest_framework',
    'blog',
]

Pagination (配置Rest API取得每頁的數據數)

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

配置可以訪問的Frontend的地址和埠

CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = ("http://localhost:8080",)

 

在瀏覽器中進入http://localhost:8000/api/ 可以看到Server提供的rest api的相關url,並可以進行操作了.

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關於MySQL的二進位日誌(binlog),我們都知道二進位日誌(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關於二進位日誌(binlog)的備份,可以基於flush logs方式先切換binlog,然後拷貝&壓縮到到遠程伺服器或本地伺服器 ...
  • 功能實現02 2.功能01-簡訊登錄 2.1基於Session實現登錄 2.1.1思路分析 2.1.2代碼實現 2.1.2.1發送簡訊驗證碼 發送簡訊驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ...
  • 本文將對幾種緩存與資料庫保證數據一致性的使用方式進行分析。為保證高併發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者: 奧特曼愛小怪獸 文章來源:GreatSQL社區原創 往期回顧 MySQL8.0 優化器介紹(一) MySQL8.0 優化器介紹(二) 本篇將進一 ...
  • 承蒙大家的支持,剛上市的《MySQL實戰》已經躍居京東自營資料庫圖書熱賣榜第 1 名,收到的反饋也普遍不錯。對該書感興趣的童鞋可通過右邊的鏈接購買。目前,京東自營有活動,只需 5 折。 主從延遲作為 MySQL 的痛點已經存在很多年了,以至於大家都有一種錯覺:有 MySQL 複製的地方就有主從延遲。 ...
  • 前言:ETL(是Extract-Transform-Load的縮寫,即數據抽取、轉換、裝載的過程),對於企業應用來說,我們經常會遇到各種數據的處理、轉換、遷移的場景。今天特地給大家彙總了一些目前市面上比較常用的ETL數據遷移工具,希望對你會有所幫助。 ...
  • 如圖,引導開始,球從上落下,同時淡入文字,然後文字開始輪播,最後一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實現 首先新建一個類 TextTranslationXGuideView,用於動畫展示 文本是類似的,最後會有個圖片箭頭動畫,佈局很簡單,就是一個 TextVi ...
  • 一. 問題描述 使用華為推送服務下發IM消息時,下發消息請求成功且code碼為80000000,但是手機總是收不到消息; 在華為推送自助分析(Beta)平臺查看發現,消息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類消息做了單個設備每日推送數量上限管理,具體 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...