橡皮擦,一个逗趣的互联网高级网虫。新的系列,让我们一起进入 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 编码
同样可以直接通过开发者工具进行查询,点击下图蓝色矩形区域即可。
应用完成之后,就可以进行复盘学习了。
通过 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\0002_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/<int:blog_id>', 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:blog_id>
前面的
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
。
相关阅读
-
Python 爬虫 100 例教程,超棒的爬虫教程,立即订阅吧
-
Python 游戏世界(更新中,目标文章数 50+,现在订阅,都是老粉)
-
Python 爬虫小课,精彩 9 讲
今天是持续写作的第 <font color="red">122</font> / 200 天。
如果你想跟博主建立亲密关系,可以关注同名公众号 <font color="red">梦想橡皮擦</font>,近距离接触一个逗趣的互联网高级网虫。
博主 ID:梦想橡皮擦,希望大家<font color="red">点赞</font>、<font color="red">评论</font>、<font color="red">收藏</font>。
<font color=white size=1>
django微信小程序商城 Django 教程 2020年php凉透了
django和spring比较 django开源项目 为什么大公司很少用vue
python的django框架 django怎么安装 django企业开发实战pdf
</font>