Django API 开发:博客系统接入 API(中)

简介: 我们的下一个项目是使用 Django REST Framework 功能的博客 API。 它将具有用户,权限,并允许完整的 CRUD(创建-读取-更新-删除)功能。 我们还将探索视图集,路由器和文档。在本文中,我们将构建博客系统基本的 API 部分。

测试

让我们为 Post 模型编写一个基本测试。 我们希望确保已登录的用户可以创建带有标题和正文的博客文章。

# posts/tests.py
from django.test import TestCase
from django.contrib.auth.models import User
from .models import Post
class BlogTests(TestCase):
    @classmethod
    def setUpTestData(cls): 
        # Create a user
        testuser1 = User.objects.create_user(username='testuser1', password='abc123')
        testuser1.save()
        # Create a blog post
        test_post = Post.objects.create(
            author=testuser1, 
            title='Blog title', 
            body='Body content...'
        )
        test_post.save()
        def test_blog_content(self):
            post = Post.objects.get(id=1)
            author = f'{post.author}'
            title = f'{post.title}'
            body = f'{post.body}'
            self.assertEqual(author, 'testuser1')
            self.assertEqual(title, 'Blog title')
            self.assertEqual(body, 'Body content...')


为了确认我们的测试正常,请退出本地服务器 Control + c。 然后运行我们的测试。

(blogapi) $ python manage.py test


您应该看到类似以下的输出,该输出确认一切正常。

(blogapi) $ python manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
. 
---------------------------------------------------------------------- Ran 1 test in 0.119s
OK
Destroying test database for alias 'default'...


现在,我们已经完成了 API 的常规 Django 部分。 我们真正需要的只是模型和数据库中的一些数据。 现在是时候添加 Django REST 框架,以将我们的模型数据转换为 API 了。

Django REST Framework

如前所述,Django REST Framework 负责将数据库模型转换为 RESTful API 的繁重工作。 此过程包括三个主要步骤:


  • URL 路由的urls.py文件
  • 将数据转换为 JSON 的serializers.py
  • 将应用逻辑用于每个 API 端点的views.py文件


在命令行中,使用 Control + c 停止本地服务器,然后使用 pipenv 安装 Django REST Framework。

(blogapi) $ pipenv install djangorestframework==3.10.3


然后将其添加到 settings.py 文件的 INSTALLED_APPS 部分。 明确设置我们的权限也是个好主意,默认情况下,Django REST Framework 中的权限已配置为 AllowAny 。 我们将在下一章中进行更新。

# blog_project/settings.py
INSTALLED_APPS = [ 
    'django.contrib.admin', 
    'django.contrib.auth',
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles',
    # 3rd-party apps 
    'rest_framework', # new
    # Local
    'posts.apps.PostsConfig', 
]
# new
REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny', 
    ]
}


现在,我们需要创建 URL,视图和序列化程序。

URLs

让我们从端点的实际位置的 URL 路由开始。 使用第二行的 include import 和我们的 posts app 的新api/v1/路由更新项目级别的 urls.py 文件。

# blog_project/urls.py
from django.contrib import admin
from django.urls import include, path # new
urlpatterns = [
    path('admin/', admin.site.urls), 
    path('api/v1/', include('posts.urls')), # new
]


最好始终对 API(v1 /,v2 /等)进行版本控制,因为进行较大的更改时,可能需要一段时间才能使 API 的各个使用者进行更新。 这样,您可以在一段时间内支持 API 的 v1,同时还可以启动新的更新的 v2,并避免破坏依赖于 API 后端的其他应用程序。


请注意,由于目前我们唯一的应用是 posts,因此我们可以直接在此处添加博客。 如果我们在一个项目中有多个应用程序,那么最好创建一个专用的 api 应用程序,然后将所有其他 API url 路由包含到其中。 但是对于像这样的基础项目,我宁愿避免使用仅用于路由的 api 应用。 如有需要,我们随时可以添加一个。


接下来,创建我们的帖子应用 urls.py 文件。

(blogapi) $ touch posts/urls.py


然后包含以下代码。

# posts/urls.py
from django.urls import path
from .views import PostList, PostDetail
urlpatterns = [
    path('<int:pk>/', PostDetail.as_view()),
    path('', PostList.as_view()),
]


所有博客路由都将位于 api/v1/ 上,因此我们的 PostList 视图(我们将很快写出)的 '' 将位于 api/v1/ 上,而 PostDetail 视图(也将被写入)位于 api/v1/# 其中 表示条目的主键。 例如,第一篇博文的主要 ID 为 1,因此它将位于路由 api/v1/1处,第二篇博文的 API 为 api/v1/2,依此类推。

Serializers

现在为我们的序列化函数。 在我们的 posts 应用中创建一个新的serializers.py文件。

(blogapi) $ touch posts/serializers.py


序列化器不仅可以将数据转换为 JSON,还可以指定要包括或排除的字段。 在我们的例子中,我们将包括 Django 自动添加到数据库模型的 id 字段,但由于不将 update_at 字段包含在我们的字段中,因此我们将排除它。


在我们的 API 中轻松包含/排除字段的功能是一项了不起的功能。 通常,基础数据库模型具有的字段远远多于需要公开的字段。 Django REST Framework 强大的序列化程序类使控制它非常简单。

# posts/serializers.py
from rest_framework import serializers 
from .models import Post
class PostSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('id', 'author', 'title', 'body', 'created_at',) 
        model = Post

在文件的顶部,我们导入了 Django REST Framework 的 serializers 类和我们自己的模型。 然后,我们创建了一个 PostSerializer,并添加了一个 Meta 类,在其中我们指定要包括的字段并显式设置要使用的模型。 自定义序列化器有很多方法,但是对于常见的用例(例如,基本的博客),这就是我们所需要的。

相关文章
|
14天前
|
JSON API 数据处理
【Swift开发专栏】Swift中的RESTful API集成实战
【4月更文挑战第30天】本文探讨了在Swift中集成RESTful API的方法,涉及RESTful API的基础概念,如HTTP方法和设计原则,以及Swift的网络请求技术,如`URLSession`、`Alamofire`和`SwiftyJSON`。此外,还强调了数据处理、错误管理和异步操作的重要性。通过合理利用这些工具和策略,开发者能实现高效、稳定的API集成,提升应用性能和用户体验。
|
2天前
|
Linux API
Linux系统编程之文件编程常用API回顾和文件编程一般步骤
Linux系统编程之文件编程常用API回顾和文件编程一般步骤
Linux系统编程之文件编程常用API回顾和文件编程一般步骤
|
6天前
|
前端开发 UED Python
Wagtail-基于Python Django的内容管理系统CMS实现公网访问
Wagtail-基于Python Django的内容管理系统CMS实现公网访问
|
13天前
|
缓存 前端开发 搜索推荐
【Flutter前端技术开发专栏】Flutter中的自定义绘制与Canvas API
【4月更文挑战第30天】Flutter允许开发者通过`CustomPaint`和`CustomPainter`进行自定义绘制,以实现丰富视觉效果。`CustomPaint` widget将`CustomPainter`应用到画布,而`CustomPainter`需实现`paint`和`shouldRepaint`方法。`paint`用于绘制图形,如示例中创建的`MyCirclePainter`绘制蓝色圆圈。Canvas API提供绘制形状、路径、文本和图片等功能。注意性能优化,避免不必要的重绘和利用缓存提升效率。自定义绘制让Flutter UI更具灵活性和个性化,但也需要图形学知识和性能意识。
【Flutter前端技术开发专栏】Flutter中的自定义绘制与Canvas API
|
13天前
|
存储 关系型数据库 Go
【Go语言专栏】基于Go语言的RESTful API开发
【4月更文挑战第30天】本文介绍了使用Go语言开发RESTful API的方法,涵盖了路由、请求处理、数据存储和测试关键点。RESTful API基于HTTP协议,无状态且使用标准方法表示操作。在Go中,通过第三方库如`gorilla/mux`进行路由映射,使用`net/http`处理请求,与数据库交互可选ORM库`gorm`,测试则依赖于Go内置的`testing`框架。Go的简洁性和并发性使得它成为构建高效API的理想选择。
|
14天前
|
机器学习/深度学习 算法 安全
深度学习在图像识别中的应用与挑战构建高效可扩展的RESTful API:后端开发的实战指南
【4月更文挑战第30天】 随着计算机视觉技术的飞速发展,深度学习在图像识别领域取得了显著的成果。本文将探讨深度学习技术在图像识别中的应用及其所面临的挑战。首先,我们将介绍深度学习的基本原理和关键技术,然后分析其在图像识别中的优势和应用案例。最后,我们将讨论当前深度学习在图像识别领域所面临的主要挑战和未来的发展趋势。
|
14天前
|
XML JSON API
【PHP开发专栏】PHP RESTful API设计与开发
【4月更文挑战第29天】本文探讨了在Web开发中流行的前后端分离模式,重点介绍了RESTful API的设计与实现。REST是一种基于HTTP协议的架构风格,核心概念包括资源、表述和状态转换。RESTful API设计遵循无状态、统一接口等原则,使用GET、POST、PUT、DELETE等HTTP方法执行操作,并通过状态码和JSON/XML传输数据。在PHP中实现RESTful API,可通过定义路由、创建控制器、处理请求和响应,同时注意安全性措施,如使用HTTPS。文中还提供了一个用户管理API的实战示例,以帮助读者更好地理解和应用RESTful API。
|
16天前
|
安全 Python
102-Django开发学校教务管理系统源码+ER图
**Django学校教务管理系统**是使用Python的Django框架开发的,专注于学生和教师的互动。系统功能包括班级管理(教师添加和管理学生,学生查看信息)、分数管理(教师打分和更新,学生查看详情)、作业管理(上传、提交和批改)、师生通讯、发布公告以及用户配置。系统支持管理员、教师和学生的不同角色和权限,特点是互动性强、操作便捷且安全性高。通过这个系统,教学过程变得更加高效,有助于提升教学质量和学习效果。
25 4
|
16天前
|
缓存 前端开发 JavaScript
【专栏】GraphQL,Facebook 开发的API查询语言,正在前端开发中崭露头角
【4月更文挑战第27天】GraphQL,Facebook 开发的API查询语言,正在前端开发中崭露头角。它提供强类型系统、灵活查询和实时更新,改善数据获取效率和开发体验。掌握GraphQL涉及学习基础概念、搭建开发环境和实践应用。结合前端框架,利用缓存和批量请求优化性能,与后端协作设计高效API。尽管有挑战,但GraphQL为前端开发开辟新道路,引领未来趋势。一起探索GraphQL,解锁前端无限可能!
|
17天前
|
API 数据安全/隐私保护 Python
101-Django开发毕业设计学院ERM系统源码
使用Django框架开发的学校ERP系统旨在提升现代教育的管理效率。该系统针对学生、老师和管理员三类用户设计,提供登录、考勤管理、分数查看、课程表、教学管理等功能。技术栈包括Python 3.11和Django 5,以及djangorestframework用于API交互。系统实现了智能化的操作,优化了学校的管理平台,提高了服务水平和教学质量。
27 0