国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-02-16 11:07:40
字體:
來源:轉載
供稿:網友

前言

我的 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)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平阴县| 大竹县| 西乌珠穆沁旗| 固原市| 于都县| 库伦旗| 霍州市| 丹寨县| 台江县| 呼图壁县| 镇巴县| 凭祥市| 荆门市| 化德县| 阳朔县| 井陉县| 新丰县| 江口县| 大化| 锡林浩特市| 太保市| 吉首市| 富源县| 迁西县| 大理市| 泾源县| 镇江市| 万全县| 德江县| 武宁县| 深泽县| 寻乌县| 金华市| 商南县| 万安县| 大方县| 寿宁县| 柳江县| 赤峰市| 高碑店市| 都江堰市|