看完這篇博客,Python Django 你就學會一半了
橡皮擦,一個逗趣的互聯網高級網蟲。新的系列,讓我們一起進入 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/
編寫完畢以上代碼之后,就可以通過 http://127.0.0.1:8000/blog/detail/1 進行單條博客數據獲取,地址 URL 的格式為 http://127.0.0.1:8000/blog/detail/{整數序號}。
在地址中輸入整數序號,可以被后臺的 blog_id 獲取到,而 blog_id 將會傳遞到 detail 方法中。
上述代碼還有一個需要特別說明一下
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:夢想橡皮擦,希望大家
、
評論
、
。
Django Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。