Python學習筆記:7.5.5 Django快速建站 - Web開發實戰API3

前言:本文是學習網易微專業的《python全棧工程師 - Django快速建站》課程的筆記,歡迎學習交流。同時感謝老師們的精彩傳授!

一、課程目標

  • 構建對網站內容的API:增、刪、改、查

二、詳情解讀

2.1.新應用
2.1.1.創建posts應用
  • python manage.py startapp posts
  • blog/settings.py中註冊posts
  • 編寫應用模型:posts/models.py
  • 遷移數據

posts/models.py文件代碼如下:

from django.db import models

from django.contrib.auth.models import User
from django.utils import timezone

class Post(models.Model):
    owner = models.ForeignKey(User, related_name='blog_posts', on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    content = models.TextField()
    is_featured = models.BooleanField(default=False)
    date_created = models.DateTimeField(default=timezone.now)
    date_modified = models.DateTimeField(detault=timezone.now)

    def __str__(self):
        return self.title
2.1.2.發佈內容
  • 增加管理項目:
    posts/admin.py
  • admin登錄
    – 發佈內容,以備後用

posts/admin.py文件如下:

from django.contrib import admin
form .models import Post

admin.site.register(Post)
2.2.API
2.2.1.posts應用的API
  • 創建目錄:posts/api
    serializers.py
    views.py

serializers.py代碼如下

from ..models import Post
from rest_framework import serializers

class PostSerializer(serializers.ModelSerializer):
	owner = serializers.ReadOnlyField(source='owner.username')
	class Meta:
		model = Post
		fields = ('title', 'content', 'is_featured', 'owner', 'date_created', 'date_modified')
		read_only_fields = ('date_created', 'date_modified')

說明:
1).read_only_fields表示當前提交接口時,date_createddate_modified不用提交內容,它會按照默認時間來添加。

views.py內容如下:

from ..models import Post
from . import serializers
from rest_framework import generics, status
from rest_framework.response import Response

class PostListView(generics.ListAPIView):
    queryset = Post.objects.all()
    serializer_class = serializers.PostSerializer

class PostCreateView(generics.CreateAPIView):
    queryset = Post.objects.all()
    serializer_class = serializers.PostSerializer


    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)
        super(PostCreateView, self).perform_create(serializer)
        response = {"status_code": status.HTTP_200_OK,
                    "message": "Successfully created",
                    "result": self.request.data}
        return Response(response)


class PostDetailView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Post.objects.all()
    serializer_class = serializers.PostSerializer

    def retrieve(self, request, *args, **kwargs):
        """
        查詢某一篇文章的詳細內容
        """
        super(PostDetailView, self).retrieve(request, args, kwargs)
        # 一篇文章相當於一個實例對象
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        data = serializer.data
        response = {"status_code": status.HTTP_200_OK,
                    "message": "Successfully retrieved",
                    "result": data}
        return Response(response)

    def patch(self, request, *args, **kwargs):
        """
        修改某一篇文章
        """
        super(PostDetailView, self).patch(request, args, kwargs)
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        data = serializer.data
        response = {"status_code": status.HTTP_200_OK,
                    "message": "Successfully updated",
                    "result": data}
        return Response(response)

    def delete(self, request, *args, **kwargs):
        """
        刪除一篇文章
        """
        super(PostDetailView, self).delete(request, args, kwargs)
        response = {"status_code": status.HTTP_200_OK,
                    "message": "Successfully deleted"}
        return Response(response)
  • 配置路由
    blog/urls.py修改爲:
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/', include('siteusers.urls')),
    path('api/posts/', include('posts.urls')), # new
]

posts/urls.py內容如下:

from django.urls import path, include
from .api import views

urlpatterns = [
    path('', views.PostListView.as_view(), name=None),
    path('create/', views.PostCreateView.as_view(), name=None),
    path('<int:pk>/', views.PostDetailView.as_view(), name=None),
]
  • 測試:
    – 先登錄:http://localhost:8000/api/v1/rest-auth/login/獲取token

在這裏插入圖片描述
– 設置token ,避免csrf問題。
在這裏插入圖片描述
– 獲取博客列表內容http://localhost:8000/api/v1/posts/
在這裏插入圖片描述
– 創建博客內容
1).注意填寫Authorization中的API Key的值
在這裏插入圖片描述
2).注意填寫headers裏的值
在這裏插入圖片描述
3).注意選取Body裏的x-www-form-urlencoded,並且上一步的headers裏的value值也是application/x-www-form-urlencoded
在這裏插入圖片描述
出現如下結果,表示創建博客成功:
在這裏插入圖片描述
查看驗證是否創建博客成功:
在這裏插入圖片描述
– 獲取某篇博客內容:http://localhost:8000/api/posts/3/
在這裏插入圖片描述
– 修改博客文章內容:(注意請求方法是patch
跟創建博客文章內容類似,也是需要注意三個地方
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
如下圖,表示修改成功:
在這裏插入圖片描述
– 刪除某一篇博客文章:(注意是delete方法還有Authorization
在這裏插入圖片描述

三、課程小結

  • 01 增、刪、改、查API的實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章