1. 程式人生 > >Django-restframework04 基於類檢視的檢視函式

Django-restframework04 基於類檢視的檢視函式

1. 基於類的檢視函式(views.py)

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from django.http import Http404
# APIView 
from rest_framework.views import APIView
# 返回物件
from rest_framework.response import Response
# 狀態碼
from rest_framework import status

# 多個物件
class
SnippetList(APIView):
def get(self, request, format=None): snippets = Snippet.objects.all() serializer = SnippetSerializer(snippets, many=True) return Response(serializer.data) def post(self, request, format=None): serializer = SnippetSerializer(data=request.data) if
serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) # 單個物件的部分修改(APIView提供了一些request和response物件) class SnippetDetail(APIView): """ 檢索,更新或刪除一個例項 """
# 首先獲取物件, 發生異常就丟擲404頁面 def get_object(self, pk): try: return Snippet.objects.get(pk=pk) except Snippet.DoesNotExist: raise Http404 def get(self, request, pk, format=None): snippet = self.get_object(pk) serializer = SnippetSerializer(snippet) return Response(serializer.data) def put(self, request, pk, format=None): snippet = self.get_object(pk) serializer = SnippetSerializer(snippet, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def delete(self, request, pk, format=None): snippet = self.get_object(pk) snippet.delete() return Response(status=status.HTTP_204_NO_CONTENT) # 重構urls.py urlpatterns = [ url(r'^snippets/$', views.SnippetList.as_view()), url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()), ] # 字尾 urlpatterns = format_suffix_patterns(urlpatterns)

2. 基於Mixin類重構檢視類

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import mixins
from rest_framework import generics

class SnippetList(mixins.ListModelMixin,
                  mixins.CreateModelMixin,
                  generics.GenericAPIView):
    # 雷打不動,必須的
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)
  • CreateModelMixin: 定義了建立一個序列物件的方法create(self, request, *args, **kwargs),儲存方法perform_create(self, serializer),成功獲取請求頭的方法:get_success_headers(self, data)
  • ListModelMixin: 定義了一個獲取查詢集的方法, many=True:list(self, request, *args, **kwargs)
  • RetrieveModelMixin: 定義了一個檢索方法,retrieve(self, request, *args, **kwargs)
  • UpdateModelMixin: 更新一個模型例項,update(self, request, *args, **kwargs)
  • DestroyModelMixin: 刪除一個模型例項,方法destroy(self, request, *args, **kwargs)
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import mixins
from rest_framework import generics
# 重構單個例項處理方法
class SnippetList(mixins.ListModelMixin,
                  mixins.CreateModelMixin,
                  generics.GenericAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

3.複合功能的View類

  1. GenericAPIView:基本的View類,定義了一些常用的方法
    • get_queryset: 獲取所有查詢集,返回序列器中指定queryset模型的全部物件
    • get_object: 根據傳入的查詢引數(lookup_url_kwarg or lookup_field)獲取查詢物件,然後返回, 一般進行聯合查詢時, 需要重寫此方法
    • get_serializer: 獲取序列化例項,傳入的引數需要通過驗證
    • get_serializer_context: 返回序列化的類,api檢視中看到的那一大串
    • paginate_queryset: 進行分頁,返回分頁後的單頁結果集
    • get_paginated_response:返回分也好的結果集到前臺
  2. CreateAPIView
  3. ListAPIView
  4. RetrieveAPIView
  5. DestroyAPIView
  6. UpdateAPIView
  7. ListCreateAPIView
  8. RetrieveUpdateAPIView
  9. RetrieveDestroyAPIView
  10. RetrieveUpdateDestroyAPIView

相關推薦

Django-restframework04 基於檢視檢視函式

1. 基於類的檢視函式(views.py) from snippets.models import Snippet from snippets.serializers import SnippetSerializer from django.http im

學習筆記-Python-Django-session、paginator、基於檢視、admin

# session - 為了應對HTTP協議的無狀態性 - 用來儲存使用者比較敏感的資訊 - 屬於request的一個屬性 - 常用操作: - request.session.get(key, defaultValue) - request.se

Django編寫RESTful API(三):基於檢視

歡迎訪問我的個人網站:www.comingnext.cn 前言 在上一篇文章中,主要講的是請求和響應,專案裡面views.py中的檢視函式都是基於函式的,並且我們介紹了@api_view這個很有用的裝飾器。同時,我們還介紹了APIView這個類,但是還沒使用它。在這篇文章中

django--基於檢視

Django 提供基本的檢視類,它們適用於絕大多數的應用。所有的檢視類繼承自View 類,它負責將檢視連線到URL、HTTP 方法排程和其它簡單的功能。 在urlconf中的簡單用法: 使用通用檢視最簡單的方法是直接在URLconf 中建立它們。如果你只是修改基於類的檢

Django 中針對基於檢視新增 csrf_exempt

在Django中對於基於函式的檢視我們可以 @csrf_exempt 註解來標識一個檢視可以被跨域訪問。那麼對於基於類的檢視,我們應該怎麼辦呢? 簡單來說可以有兩種訪問來解決 方法一:在類的 d

Django-深度分析Django基於檢視(1)(翻譯)

時間有限,只能簡單翻譯,略去一些無關緊要的細節。 本文是基於Django1.5版的,但是原理分析依舊非常有意義。 什麼是基於類的檢視?(CBV) Django類也就是Python類。一個Django檢視就是就是用來處理HTTP請求並返回HTTP響應的一段程式碼。不多不少

Django REST framework教程三: 基於檢視

教程索引目錄 Django REST framework的系列教程 對於需要通篇瞭解的同學,可以點選教程索引目錄。 其實,與其使用基於方法(function based)的檢視,我們更加傾向使用基於類(class based)的檢視。接下來,你將看到這

Django2基於檢視詳解

一、基本檢視     view     TemplateView     RedirectView 二、通用顯示檢視     DetailView     ListView 三、通用編輯檢視

從3000行縮減到1000行,用django代替檢視函式

博主最近寫了一個網站, 要求同時支援簡繁英三個版本, 為了網站快速被主流搜尋引擎爬取收錄, 網頁所需資料由後端渲染好, 一次性返回給前端. 博主對django比較熟悉, 所有用django做了後端渲染 網站1.0版本的需求很少, 就是幾個靜態頁面, 在任何頁面可

Django基於的編輯檢視和Mixins

== 內建的基於類的通用編輯檢視 (Forms) 表單(處理)通常包含3條路徑: * 初始的GET (空或預填充的表單) * 非法資料的POST (通常重新顯示錶單並提示錯誤) * 合法資料的POST (處理資料並通常重定向) 你自己實現這些常常需要重複很多模式化的程式碼。

Django 1.6 基於的通用檢視

最初 django 的檢視都是用函式實現的,後來開發出一些通用檢視函式,以取代某些常見的重複性程式碼。通用檢視就像是一些封裝好的處理器,使用它們的時候只須要給出特定的引數集即可,不必關心具體的實現。各種通用檢視的參考參見:https://docs.djangoproject.com/en/1.6/ref/c

四十二、python學習之Django框架(二):檢視與中介軟體

五、類檢視: 1.類檢視引入: 以函式的方式定義的檢視成為函式檢視,即我們常說的檢視函式. 但是, 檢視函式遭遇不同的請求方法(如get和post),並且需要做不同的處理時,我們如果在一個函式中編寫不同的業務邏輯,程式碼可讀性和複用性都不好. 例如:

Django路由配置系統,檢視函式

一、路由配置系統(URLconf) URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL與要為該URL呼叫的檢視函式之間的對映表;你就是以這種方式告訴Django,對於這個URL呼叫這段程式碼,對於那個URL呼叫那段程式碼。 ''' urlpatterns

Django框架--四--檢視

1.函式檢視與類檢視的比較 在講解類檢視之前,我們可以先看一下,普通的檢視函式在處理請求的時候,是怎樣的一種情況: def register(request): """註冊""" # 獲取請求方法,判斷是GET/POST請求 if request.me

python裡使用dir函式檢視一個所有成員函式

如果一個類是別人編寫的,又沒有幫助文件,怎麼樣來檢視所有成員函式呢?就可以使用下面的程式碼:# File: builtin-dir-example-2.py class A: def a(self): pass def b(self):

如何檢視Python函式呼叫圖 Ubuntu

說明:有時候想看看Python的函式呼叫圖,此時  pycallgraph  就顯示出他的用途了。 安裝 pycallgraph pip install pycallgraph 安裝 graphviz,使用dot -v 驗證安裝,記

Django學習(2)-- 檢視(View)

當我們在瀏覽器中輸入網址請求網站的時候在Django中請求的是檢視(View),檢視接收請求並且處理,返回給請求者。 使用檢視時需要執行兩步操作:   1設計檢視函式   2配置URLconf   1設計檢視函式:   檢視就是一個python函式,被定義在應用的view中;   這個

django之全域性預設設定檢視及admin語言設定

django之admin語言設定   admin後臺管理預設使用的是英文,有時我們需要將其設定成自己的語言以方便使用管理;    將 LANGUAGE_CODE = '' 設定為欲設定的語言即可。   以下為django原始碼中給定的語言可選項: # Languages we

mysql 查詢表,檢視,觸發器,函式,儲存過程

轉載自 http://www.cnblogs.com/sx2zx/p/6245887.html -1. mysql查詢所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '資料庫名' AND

django-基於登入

from django.views.generic.base import View class LoginView(View): def get(self, request): return render(request, 'login.html', {}) de