看完這篇博客,Python Django 你就學會一半了

      網友投稿 703 2025-04-01

      橡皮擦,一個逗趣的互聯網高級網蟲。新的系列,讓我們一起進入 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 擴展詳情頁

      看完這篇博客,Python Django 你就學會一半了

      有了上文的邏輯關系之后,在實現一個返回單條博客數據的接口,首先編輯 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/', 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:夢想橡皮擦,希望大家

      評論

      、

      。

      Django Python

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:vue框架學習
      下一篇:wps技巧如何縮小表格文字間距(wps怎么縮小表格行間距)
      相關文章
      亚洲欧美日韩综合俺去了| 亚洲性无码av在线| 亚洲国产av一区二区三区丶| 国产亚洲综合久久系列| 久久久久亚洲?V成人无码| 亚洲不卡无码av中文字幕| 亚洲AV无码专区在线电影成人| 中文无码亚洲精品字幕| 亚洲一级特黄特黄的大片| 亚洲AV无码乱码麻豆精品国产| 亚洲国产精品一区二区久| 亚洲国产情侣一区二区三区| 亚洲综合小说久久另类区| 亚洲综合无码一区二区三区| 久久久久亚洲AV无码观看| 亚洲视频在线观看免费| 亚洲黄色在线观看视频| 亚洲精品亚洲人成在线观看麻豆| 亚洲网站在线播放| 亚洲福利视频一区二区三区| 亚洲区视频在线观看| 国产成人精品日本亚洲专| 最新亚洲卡一卡二卡三新区| 亚洲爆乳成av人在线视菜奈实| 成a人片亚洲日本久久| 亚洲精品国产高清嫩草影院 | 亚洲精品一级无码中文字幕| 亚洲精品国产高清不卡在线| 亚洲一区二区三区影院| 亚洲Av无码专区国产乱码DVD| 亚洲精品高清视频| 亚洲成人福利网站| 日韩亚洲人成在线| 亚洲成av人片天堂网无码】| 亚洲高清无码专区视频| 国产亚洲综合色就色| 亚洲一级二级三级不卡| 亚洲国产成人无码av在线播放| 亚洲情A成黄在线观看动漫软件| 亚洲欧美日韩久久精品| 亚洲精品国精品久久99热|