看完这篇博客,Python Django 你就学会一半了

网友投稿 589 2022-05-29

橡皮擦,一个逗趣的互联网高级网虫。新的系列,让我们一起进入 Django 世界。

五、Python Django 视图

5.1 视图返回 JSON 数据

在真实工作中 ,Python Web 工程师会向前端工程师反馈接口数据,接口一般称为 API,常见返回数据的格式是 XML 或者 JSON,接下来,就以最常见的 JSON 格式数据为案例,为你详细说明,Django 中是如何从数据库向前台发送数据的。

修改 views.py 文件。

from django.shortcuts import render # 导入 JSON 格式数据响应类 from django.http import JsonResponse from .models import Blog # Create your views here. def blog_list(request): blogs = Blog.objects.all() # 用列表生成器生成一个对象 context = { "data": [{"id": blog.id, "title": blog.title} for blog in blogs] } return JsonResponse(context)

在该文件头部导入 models 中的 Blog 类,然后在通过新增加一个 blog_list 函数返回 JsonResponse 对象。

5.2 创建路由

路由相关资料后续会进行补充,本篇博客只需要掌握到通过不同 URL 返回不同数据即可。

在 blog 文件夹中创建一个新的文件 urls.py,代码内容如下:

from django.urls import path import blog.views as blog_views urlpatterns = [ path('list/', blog_views.blog_list) ]

该文件代码编写完毕,还需要修改 my_website 文件夹中的 urls.py 文件,修改部分如下:

from django.contrib import admin from django.urls import path, include urlpatterns = [ path('blog/', include('blog.urls')), path('admin/', admin.site.urls), ]

此时你的项目文件结构如下图所示,重点注意 urls.py 文件出现了两次。

通过下述命令运行现在的应用程序:

python manage.py runserver

直接访问 http://127.0.0.1:8000/ 会出如下错误,要求必须访问一个目录。输入 http://127.0.0.1:8000/admin 访问之前博客涉及的后台,输入 http://127.0.0.1:8000/blog/list/ 得到 JSON 格式的数据。

JSON 格式数据如下,中文被进行了 UNICODE 编码

同样可以直接通过开发者工具进行查询,点击下图蓝色矩形区域即可。

![看完这篇博客,Python Django 你就学会一半了](https://img-blog.csdnimg.cn/20210329092456588.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hpaGVsbA==,size_16,color_FFFFFF,t_70#pic_center =600x)

应用完成之后,就可以进行复盘学习了。

通过 URL 地址进行访问,如果访问的地址是 /blog,Django 会自动加载 urls.py 中的配置,即下述代码:

urlpatterns = [ path('blog/', include('blog.urls')), path('admin/', admin.site.urls), ]

发现匹配到 url 中的 blog/,然后加载 blog.urls 文件,对应文件代码如下:

from django.urls import path import blog.views as blog_views urlpatterns = [ path('list/', blog_views.blog_list) ]

这里包含了一个 list/ 匹配器,所以通过 blog/list/ 调用了视图中 blog_view.blog_list 函数,该函数用于返回 JSON 格式的数据。注意 blog_view 是导入的 view 模块进行重命名得来,代码在头部 import blog.views as blog_views。

def blog_list(request): blogs = Blog.objects.all() # 用列表生成器生成一个对象 context = { "data": [{"id": blog.id, "title": blog.title} for blog in blogs] } return JsonResponse(context)

先理解逻辑关系,后续在补充专业的语法定义。

5.3 扩展详情页

有了上文的逻辑关系之后,在实现一个返回单条博客数据的接口,首先编辑 views.py 文件。

def detail(request, blog_id): blog = Blog.objects.get(id=blog_id) blog = { "id": blog.id, "title": blog.title, "content": blog.content, "create_time": blog.create_time } return JsonResponse(blog)

扩展详情页,发现一个单词拼写错误,修改 create_time 之后,注意使用如下命令对 sqlite 进行重新生成。

> python manage.py makemigrations blog Did you rename blog.creatr_time to blog.create_time (a DateField)? [y/N] y Migrations for 'blog': blog\migrations

> python manage.py makemigrations blog Did you rename blog.creatr_time to blog.create_time (a DateField)? [y/N] y Migrations for 'blog': blog\migrations\0002_auto_20210329_0940.py - Rename field creatr_time on blog to create_time

02_auto_20210329_0940.py - Rename field creatr_time on blog to create_time

该命令运行完,再运行下述命令:

>python manage.py migrate blog Operations to perform: Apply all migrations: blog Running migrations: Applying blog.0002_auto_20210329_0940... OK

继续修改 blog 文件夹中的 urls.py 文件,代码如下:

from django.urls import path import blog.views as blog_views urlpatterns = [ path('list/', blog_views.blog_list), path('detail/', blog_views.detail) ]

编写完毕以上代码之后,就可以通过 http://127.0.0.1:8000/blog/detail/1 进行单条博客数据获取,地址 URL 的格式为 http://127.0.0.1:8000/blog/detail/{整数序号}。

在地址中输入整数序号,可以被后台的 blog_id 获取到,而 blog_id 将会传递到 detail 方法中。

上述代码还有一个需要特别说明一下 前面的 int 被称作路径转换器,常见的路径转换器有如下内容:

str:匹配任何非空字符串,默认值;

int:匹配零或正整数;

uuid:匹配一种特定类型的字符串格式;

path:匹配任何非空字符,可以匹配路径地址,包括 /。

后面的博客对上述内容都会有所涉及,先应用起来为主,毕竟滚雪球系列是一个反复学习的专栏。

5.4 分页实现

接下来继续对 blog_list 方法进行扩展,让其实现分页操作。重点对 views.py 中的 blog_list(request) 方法进行改造,核心代码参考下述内容。

from django.shortcuts import render # 导入 JSON 格式数据响应类 from django.http import JsonResponse # 导入分页组件 from django.core.paginator import Paginator from .models import Blog # Create your views here. def blog_list(request): # blogs = Blog.objects.all() # # 用列表生成器生成一个对象 # context = { # "data": [{"id": blog.id, "title": blog.title} for blog in blogs] # } # 页码默认获取 page 参数,默认值为 1 page = request.GET.get("page", 1) # 默认每页 20 条数据 page_size = request.GET.get("page_size", 20) # 获取全部数据 blog_all = Blog.objects.all() # 分页对象 paginator = Paginator(blog_all, page_size) # 当前页码 current_page = paginator.get_page(page) blogs = current_page.object_list context = { "blog_list": [{"id": blog.id, "title": blog.title} for blog in blogs], "paginator": { "total_count": paginator.count, "num_pages": paginator.num_pages, "page_size": paginator.per_page, "page_number": current_page.number } } return JsonResponse(context)

在代码顶部导入 from django.core.paginator import Paginator 分页模块,用于后续的分页内容,数据通过 Blog.objects.all() 方法提前获取,该方式存在效率问题,后续学习到进阶内容,将会对本部分进行修改。

编写完毕,通过 URL 相关参数即可实现分页效果。访问 http://127.0.0.1:8000/blog/list/?page=1&page_size=1 得到的效果如下:

5.5 这篇博客的总结

本篇博客重点学习了 Django 中的视图,本文是基于函数的视图(FBV),在以后的博客中,我们将学习基于类的视图(CBV),在实际的开发中基于类视图应用比较广泛,使用 Django 开发 API 也有成熟的框架借鉴,例如 Django Rest Framework。

今天是持续写作的第

122

/ 200 天。

博主 ID:梦想橡皮擦,希望大家

看完这篇博客,Python Django 你就学会一半了

评论

Django Python

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spark 与 Python 简介 – PySpark 初学者
下一篇:Jetpack DataStore 你总要了解一下吧?
相关文章