Django——REST framework
阿新 • • 發佈:2017-08-06
errors self hat 發的 jsonp arc pip url 數據
1. 什麽是REST
- REST與技術無關,代表的是一種軟件架構風格,REST是Representational State Transfer的簡稱,中文翻譯為“表征狀態轉移”
- REST從資源的角度類審視整個網絡,它將分布在網絡中某個節點的資源通過URL進行標識,客戶端應用通過URL來獲取資源的表征,獲得這些表征致使這些應用轉變狀態
- REST與技術無關,代表的是一種軟件架構風格,REST是Representational State Transfer的簡稱,中文翻譯為“表征狀態轉移”
- 所有的數據,不過是通過網絡獲取的還是操作(增刪改查)的數據,都是資源,將一切數據視為資源是REST區別與其他架構風格的最本質屬性
- 對於REST這種面向資源的架構風格,有人提出一種全新的結構理念,即:面向資源架構(ROA:Resource Oriented Architecture)
設計參考:http://www.ruanyifeng.com/blog/2014/05/restful_api.html
2. 目前如何實現 REST API ?
按照規則,根據不同的請求方式做出不同的處理,並且返回內容以及相應狀態碼
3. 什麽是 Django REST framework?
Django REST framework是一個基於Django開發的app,用於快速搭建REST API。
安裝:
pip3 install djangorestframework
a. 快速使用
1. 註冊APP1 from rest_framework import routers 2 from . import views 3 4 5 router = routers.DefaultRouter() 6 router.register(r‘users‘, views.UserInfoViewSet) 7 8 urlpatterns = [ 9 url(r‘^‘, include(router.urls)), 10 ]2. 註冊路由
1 from rest_framework import viewsets 2 from3. 編寫ViewSet,視圖函數. import models 3 from . import serializers 4 5 # ########### 1. 基本處理方式 ########### 6 7 class UserInfoViewSet(viewsets.ModelViewSet): 8 """ 9 API endpoint that allows users to be viewed or edited. 10 """ 11 queryset = models.UserInfo.objects.all().order_by(‘-id‘) 12 serializer_class = serializers.UserInfoSerializer
1 from rest_framework import serializers 2 from . import models 3 4 class UserInfoSerializer(serializers.HyperlinkedModelSerializer): 5 class Meta: 6 model = models.UserInfo 7 # fields = (‘id‘, ‘username‘, ‘pwd‘,‘ug‘) # fields = ‘__all__‘ 8 exclude = (‘ug‘,) 9 depth = 1 # 0<=depth<=104. 編寫serializers,form驗證以及數據庫操作
PS:最終訪問路徑
1 [GET] http://127.0.0.1:8000/api/users/ 2 [POST] http://127.0.0.1:8000/api/users/ 3 [GET] http://127.0.0.1:8000/api/users/7/ 4 [PUT] http://127.0.0.1:8000/api/users/7/ 5 [DELETE] http://127.0.0.1:8000/api/users/7/
b. 基於CBV
1 from django.conf.urls import url,include 2 from django.contrib import admin 3 from . import views 4 5 urlpatterns = [ 6 url(r‘^users/$‘, views.UserList.as_view()), 7 url(r‘^users/(?P<pk>[0-9]+)/$‘, views.UserDetail.as_view()), 8 ]1. URL
1 from rest_framework.views import APIView 2 from rest_framework.response import Response 3 from rest_framework.request import Request 4 from rest_framework.parsers import JSONParser 5 from . import models 6 from . import serializers 7 8 9 class UserList(APIView): 10 def get(self, request, *args, **kwargs): 11 user_list = models.UserInfo.objects.all() 12 serializer = serializers.MySerializer(instance=user_list, many=True) 13 return Response(serializer.data) 14 15 def post(self, request, *args, **kwargs): 16 data = JSONParser().parse(request) 17 serializer = serializers.MySerializer(data=data) 18 if serializer.is_valid(): 19 # print(serializer.data) 20 # print(serializer.errors) 21 # print(serializer.validated_data) 22 # 如果有instance,則執行update方法;否則,執行create 23 serializer.save() 24 return Response(serializer.data, status=201) 25 return Response(serializer.errors, status=400) 26 27 28 class UserDetail(APIView): 29 def get(self, request, *args, **kwargs): 30 obj = models.UserInfo.objects.filter(pk=kwargs.get(‘pk‘)).first() 31 serializer = serializers.MySerializer(obj) 32 return Response(serializer.data) 33 34 def delete(self, request, *args, **kwargs): 35 obj = models.UserInfo.objects.filter(pk=kwargs.get(‘pk‘)).first() 36 obj.delete() 37 return Response(status=204) 38 39 def put(self, request, *args, **kwargs): 40 data = JSONParser().parse(request) 41 obj = models.UserInfo.objects.filter(pk=kwargs.get(‘pk‘)).first() 42 serializer = serializers.MySerializer(obj, data=data) 43 if serializer.is_valid(): 44 serializer.save() 45 return Response(serializer.data) 46 return Response(serializer.errors, status=400)2. 編寫視圖函數
1 from rest_framework import serializers 2 from rest_framework.exceptions import ValidationError 3 from . import models 4 5 6 class MySerializer(serializers.Serializer): 7 id = serializers.IntegerField(read_only=True) 8 username = serializers.CharField(required=False, allow_blank=True, max_length=100) 9 pwd = serializers.CharField() 10 11 def validate_username(self, value): 12 if value == ‘中國‘: 13 raise ValidationError(‘用戶名中存在敏感字符‘) 14 return value 15 16 def validate_pwd(self, value): 17 print(value) 18 return value 19 20 def validate(self, attrs): 21 print(attrs) 22 return attrs 23 24 def create(self, validated_data): 25 """ 26 當執行save方法時,自動調用。instance未傳值 27 :param validated_data: 28 :return: 29 """ 30 print(validated_data) 31 return models.UserInfo.objects.create(**validated_data) 32 33 def update(self, instance, validated_data): 34 """ 35 當執行save方法時,自動調用。instance傳值 36 :param instance: 37 :param validated_data: 38 :return: 39 """ 40 instance.username = validated_data.get(‘username‘, instance.username) 41 instance.save() 42 return instance3. 編寫serializer
c. 基於FBV
1 from django.conf.urls import url,include 2 from django.contrib import admin 3 from . import views 4 5 urlpatterns = [ 6 url(r‘^users/$‘, views.user_list), 7 url(r‘^users/(?P<pk>[0-9]+)/$‘, views.user_detail), 8 ]1. URL
1 from django.http import JsonResponse,HttpResponse 2 from rest_framework.response import Response 3 from rest_framework.parsers import JSONParser 4 from rest_framework.decorators import api_view 5 from .serializers import MySerializer 6 from . import models 7 8 @api_view([‘GET‘,"POST"]) 9 def user_list(request): 10 """ 11 List all code snippets, or create a new snippet. 12 """ 13 if request.method == ‘GET‘: 14 user_list = models.UserInfo.objects.all() 15 serializer = MySerializer(user_list,many=True) 16 return Response(serializer.data) 17 18 elif request.method == ‘POST‘: 19 data = JSONParser().parse(request) 20 serializer = MySerializer(data=data) 21 if serializer.is_valid(): 22 print(serializer.data) 23 print(serializer.errors) 24 print(serializer.validated_data) 25 # 如果有instance,則執行update方法;否則,執行create 26 serializer.save() 27 return Response(serializer.data, status=201) 28 return Response(serializer.errors, status=400) 29 30 @api_view([‘GET‘,"POST","PUT"]) 31 def user_detail(request, pk): 32 """ 33 Retrieve, update or delete a code snippet. 34 """ 35 36 obj = models.UserInfo.objects.filter(pk=pk).first() 37 if not obj: 38 return HttpResponse(status=404) 39 40 if request.method == ‘GET‘: 41 serializer = MySerializer(obj) 42 # return JsonResponse(serializer.data,json_dumps_params={‘ensure_ascii‘:False},content_type=‘application/json;charset=utf-8‘) 43 return Response(serializer.data) 44 45 elif request.method == ‘PUT‘: 46 data = JSONParser().parse(request) 47 serializer = MySerializer(obj, data=data) 48 if serializer.is_valid(): 49 serializer.save() 50 return Response(serializer.data) 51 return Response(serializer.errors, status=400) 52 53 elif request.method == ‘DELETE‘: 54 obj.delete() 55 return Response(status=204)2. 視圖函數
1 from rest_framework import serializers 2 from rest_framework.exceptions import ValidationError 3 from . import models 4 5 6 class MySerializer(serializers.Serializer): 7 id = serializers.IntegerField(read_only=True) 8 username = serializers.CharField(required=False, allow_blank=True, max_length=100) 9 pwd = serializers.CharField() 10 11 def validate_username(self, value): 12 if value == ‘中國‘: 13 raise ValidationError(‘用戶名中存在敏感字符‘) 14 return value 15 16 def validate_pwd(self, value): 17 print(value) 18 return value 19 20 def validate(self, attrs): 21 print(attrs) 22 return attrs 23 24 def create(self, validated_data): 25 """ 26 當執行save方法時,自動調用。instance未傳值 27 :param validated_data: 28 :return: 29 """ 30 print(validated_data) 31 return models.UserInfo.objects.create(**validated_data) 32 33 def update(self, instance, validated_data): 34 """ 35 當執行save方法時,自動調用。instance傳值 36 :param instance: 37 :param validated_data: 38 :return: 39 """ 40 instance.username = validated_data.get(‘username‘, instance.username) 41 instance.save() 42 return instance3. 編寫serializer
d. 權限控制
1 REST_FRAMEWORK = { 2 ‘DEFAULT_PERMISSION_CLASSES‘: [ 3 ‘permissi.MyPermission‘, 4 ] 5 }1. settings配置文件
1 class MyPermission(object): 2 """ 3 A base class from which all permission classes should inherit. 4 """ 5 6 def has_permission(self, request, view): 7 """ 8 Return `True` if permission is granted, `False` otherwise. 9 """ 10 11 return True 12 13 def has_object_permission(self, request, view, obj): 14 return True2. 權限控制
轉載在銀角大王:
Django REST framework
Django——REST framework