最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django REST為文件屬性輸出完整URL的方法

 更新時間:2017年12月18日 09:47:32   作者:TUALATRIX  
這篇文章主要給大家介紹了關于Django REST如何為文件屬性輸出完整URL的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用django具有一定的參考學習價值,需要的朋友們下面來一起看看吧。

前言

我的 App 項目的 API 部分是使用 Django REST Framework 來搭建的,它可以像搭積木一樣非常方便地搭出 API,兼具方便和靈活。

django是一個神奇的框架,而restframework又是遵循了這個框架的另一個神奇的框架,然而由于restframework的文檔稀爛無比,很多時候你必須看源碼才能寫出科學的代碼,這擋住了很多新手的路。

在使用的過程中我也積累了一些小技巧,這里寫一則關于如何為文件屬性輸出完整 URL 的字段。

實現方法

一個典型的案例是,當請求 /profile/ 這個 API 的時候,返回類似于這樣的結果:

{
 "id": 1,
 "nickname": "管理員",
 "mobilephone": "1234567890",
 "avatar": "/media/profiles/2017/12/17/avatar.png"
}

在 Django REST 的定義中,我使用了自定義的一個擴展自 rest_framework.views.APIView 的 ProfileView 類型,實現了它的 get 方法,來給認證的用戶返回一個 Profile 對象:

class ProfileView(APIView):
 def get(self, request):
  user = request.user
  if user.is_authenticated:
   profile = Profile.objects.get(user=user)
   return Response(ProfileSerializer(profile).data)
  else:
   raise exceptions.AuthenticationFailed('Not authenticated user!')

這里的邏輯很簡單,判斷請求當前 API 的用戶是不是已經驗證過的用戶,如果是的話,再得到它的 Profile,再通過 ProfileSerializer 把 profile 實例序列化成 JSON 對象。如果不是已驗證用戶,則會返回 401 驗證失敗相關信息。

以上輸出的內容,交給 Web 前端使用是沒什么問題的,但如果是給 App 使用,那么 avatar 這個文件屬性的相對 URL 不太合適,于是我們要改造一下這個 API,使其能輸出絕對 URL。

如何做呢?只需要將上面的 get 方法,稍加修改即可:

-class ProfileView(APIView):
+class ProfileView(generics.GenericAPIView):
  parser_classes = (MultiPartParser, FormParser)
+ serializer_class = ProfileSerializer
  def get(self, request):
   user = request.user
   if user.is_authenticated:
    profile = Profile.objects.get(user=user)
-   return Response(ProfileSerializer(profile).data)
+   serializer = self.get_serializer(profile)
+   return Response(serializer.data)
   else:
    raise exceptions.AuthenticationFailed('Not authenticated user!')

不同于之前繼承自 APIView,現在繼承自 generics.GenericAPIView,這是一個更通用的類,可以看到,這里通過手動構建 ProfileSerializer 改成通過 self.get_serializer 來進行,這里有什么不同呢?

還得看看 Django REST 的源碼,GenericAPIView 這個類的 get_serializer 在做什么。

def get_serializer(self, *args, **kwargs):
    """
    Return the serializer instance that should be used for validating and
    deserializing input, and for serializing output.
    """
    serializer_class = self.get_serializer_class()
    kwargs['context'] = self.get_serializer_context()
    return serializer_class(*args, **kwargs)

可以看到,這個方法在創(chuàng)建 serializer 的時候,會把 context 傳進去,而 get_serializer_context 也是一個固定方法,它會把 request、view 和 format 這些信息包含在里面。

那么 request、view 和 format 這些信息,是如何用在 serializer 里面,最后把一個文件對象的全路徑展開的呢?

省略中間 serializer 一系列序列化過程,當它遇到 FileField 的時候,會通過判斷 context 里面有沒有 reuqest,有的話,就調用 request.build_absolute_uri(url) 方法,把絕對地址 build 出來,而不是默認存在數據庫里的相對地址。

def to_representation(self, value):
  if not value:
   return None
  use_url = getattr(self, 'use_url', api_settings.UPLOADED_FILES_USE_URL)
  if use_url:
   if not getattr(value, 'url', None):
    # If the file has not been saved it may not have a URL.
    return None
   url = value.url
   request = self.context.get('request', None)
   if request is not None:
    return request.build_absolute_uri(url)
   return url
  return value.name

這就是為什么通過 GenericAPIView 來輸出 API 對象,文件屬性默認有絕對路徑而不是相對路徑的原因了~

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • python 尋找list中最大元素對應的索引方法

    python 尋找list中最大元素對應的索引方法

    今天小編就為大家分享一篇python 尋找list中最大元素對應的索引方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Matlab中如何實現將長字符串換行寫

    Matlab中如何實現將長字符串換行寫

    這篇文章主要介紹了Matlab中如何實現將長字符串換行寫問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • python求質數的3種方法

    python求質數的3種方法

    這篇文章主要為大家詳細介紹了python求質數的多種方法,多種方法求質數的實現代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Sanic框架安裝與簡單入門示例

    Sanic框架安裝與簡單入門示例

    這篇文章主要介紹了Sanic框架安裝與簡單用法,結合實例形式簡單分析了Sanic框架的概念、原理、pip命令安裝以及使用方法,需要的朋友可以參考下
    2018-07-07
  • python實現百度關鍵詞排名查詢

    python實現百度關鍵詞排名查詢

    這篇文章主要介紹了python實現百度關鍵詞排名查詢,需要的朋友可以參考下
    2014-03-03
  • Pycharm IDE安裝環(huán)境配置的2025最新完整版教程

    Pycharm IDE安裝環(huán)境配置的2025最新完整版教程

    PyCharm是目前最流行、使用最廣泛的Python IDE,帶有一整套可以幫助用戶在使用Python語言開發(fā)時提高其效率的工具,下面我們來看看Pycharm IDE安裝環(huán)境配置的最新教程吧
    2025-03-03
  • python+logging+yaml實現日志分割

    python+logging+yaml實現日志分割

    這篇文章主要為大家詳細介紹了python+logging+yaml實現日志分割,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 使用Python編寫錄屏錄音工具

    使用Python編寫錄屏錄音工具

    這篇文章主要為大家詳細介紹了如何使用Python編寫一個錄屏錄音工具,工具界面十分簡單,默認是全屏錄屏錄音,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-12-12
  • 詳細總結Python類的多繼承知識

    詳細總結Python類的多繼承知識

    Python類的多繼承知識是非常易于新手理解的,如果你是剛剛入門Python的話,歡迎參考本篇文章,本文對Python類的多繼承知識作出了非常詳細的解釋,還有相關代碼參考哦。
    2021-05-05
  • Python 實現某個功能每隔一段時間被執(zhí)行一次的功能方法

    Python 實現某個功能每隔一段時間被執(zhí)行一次的功能方法

    今天小編就為大家分享一篇Python 實現某個功能每隔一段時間被執(zhí)行一次的功能方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10

最新評論

浦城县| 称多县| 全南县| 红安县| 通州市| 日照市| 嘉义县| 长白| 京山县| 民勤县| 乐亭县| 五河县| 柞水县| 呼玛县| 岑溪市| 菏泽市| 盐源县| 青海省| 徐水县| 宜黄县| 岗巴县| 图们市| 衡阳县| 阿克| 白银市| 瓦房店市| 南召县| 乳山市| 泸定县| 孟州市| 福安市| 道真| 上栗县| 丰镇市| 调兵山市| 玛沁县| 曲沃县| 漠河县| 平乐县| 英超| 晋州市|