1. 程式人生 > >Django——REST framework

Django——REST framework

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. 註冊APP 技術分享
 1 from rest_framework import routers
 2 from . import views
 3 
 4 
 5 router = routers.DefaultRouter()
 6 router.register(rusers, views.UserInfoViewSet)
 7 
 8 urlpatterns = [
 9     url(r^, include(router.urls)),
10 ]
2. 註冊路由 技術分享
 1 from rest_framework import viewsets
 2 from
. 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
3. 編寫ViewSet,視圖函數 技術分享
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<=10
4. 編寫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 instance
3. 編寫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 instance
3. 編寫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 True
2. 權限控制

轉載在銀角大王:

Django REST framework

Django——REST framework