前言:本文是學習網易微專業的《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_created
和date_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
的實現