一、视图三部曲

https://www.cnblogs.com/wupeiqi/articles/7805382.html

使用混合(mixins)

之前得视图部分

  1. # urls.py
  2.  
  3. from django.conf.urls import url
  4. from django.contrib import admin
  5.  
  6. from app01 import views
  7.  
  8. urlpatterns = [
  9. url(r'^admin/', admin.site.urls),
  10. url(r'^publishes/$', views.PublishView.as_view(),name="publish"),
  11. url(r'^publishes/(?P<pk>\d+)/$', views.PublishDetailView.as_view(),name="detail_publish"),
  12. url(r"^books/$", views.BookView.as_view(),name="books"),
  13. url(r'^books/(?P<pk>\d+)/$',views.BookDetailView.as_view(),name="detail_book")
  14.  
  15. ]
  16.  
  17. ------------------------------------------------------
  18.  
  19. # views.py
  20.  
  21. from rest_framework.views import APIView, Response
  22. from app01.serializers import *
  23.  
  24. class PublishView(APIView):
  25. def get(self, request):
  26. publish_list = Publish.objects.all()
  27. ret = PublishModelSerializers(publish_list, many=True)
  28. return Response(ret.data)
  29.  
  30. def post(self, request):
  31. ps = PublishModelSerializers(data=request.data)
  32. if ps.is_valid():
  33. ps.save()
  34. return Response(ps.data)
  35. else:
  36. return Response(ps.errors)
  37.  
  38. class PublishDetailView(APIView):
  39. def get(self,request,pk):
  40. publish = Publish.objects.filter(pk=pk).first()
  41. ps = PublishModelSerializers(publish)
  42. return Response(ps.data)
  43.  
  44. def put(self,request,pk):
  45. publish = Publish.objects.filter(pk=pk).first()
  46. ps = PublishModelSerializers(publish,data=request.data)
  47. if ps.is_valid():
  48. ps.save()
  49. return Response(ps.data)
  50. else:
  51. return Response(ps.errors)
  52.  
  53. def delete(self,request,pk):
  54. Publish.objects.filter(pk=pk).delete()
  55. return Response()
  56.  
  57. class BookView(APIView):
  58. def get(self, request):
  59. book_list = Book.objects.all()
  60. ret = BookModelSerializers(book_list, many=True,context={"request":request})
  61. return Response(ret.data)
  62.  
  63. def post(self, request):
  64. bms = BookModelSerializers(data=request.data, many=False,context={"request":request})
  65. if bms.is_valid():
  66. bms.save()
  67. return Response(bms.data)
  68. else:
  69. return Response(bms.errors)
  70.  
  71. class BookDetailView(APIView):
  72. def get(self,request,pk):
  73. book = Book.objects.filter(pk=pk).first()
  74. # 序列化
  75. bms = BookModelSerializers(book,context={"request":request})
  76. return Response(bms.data)
  77.  
  78. def put(self,request,pk):
  79. book = Book.objects.filter(pk=pk).first()
  80. bms = BookModelSerializers(book,data=request.data,context={"request":request})
  81. if bms.is_valid():
  82. bms.save()
  83. return Response(bms.data)
  84. else:
  85. return Response(bms.errors)
  86.  
  87. def delete(self,reqeust,pk):
  88. Book.objects.filter(pk=pk).delete()
  89. return Response()
  90.  
  91. ---------------------------------------------------
  92. # serializers.py
  93.  
  94. # -*- coding:utf-8 -*-
  95. from .models import *
  96. from rest_framework import serializers
  97.  
  98. class PublishModelSerializers(serializers.ModelSerializer):
  99. class Meta:
  100. model = Publish
  101. fields = "__all__"
  102.  
  103. class BookModelSerializers(serializers.ModelSerializer):
  104. class Meta:
  105. model = Book
  106. fields = "__all__"
  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class Book(models.Model):
  6. title = models.CharField(max_length=32)
  7. price = models.IntegerField()
  8. pub_date = models.DateField()
  9. publish = models.ForeignKey("Publish")
  10. authors = models.ManyToManyField("Author")
  11.  
  12. def __str__(self):
  13. return self.title
  14.  
  15. class Publish(models.Model):
  16. name = models.CharField(max_length=32)
  17. email = models.EmailField()
  18.  
  19. def __str__(self):
  20. return self.name
  21.  
  22. class Author(models.Model):
  23. name = models.CharField(max_length=32)
  24. age = models.IntegerField()
  25.  
  26. def __str__(self):
  27. return self.name

models.py

1. mixin类编写视图

from rest_framework import mixins, generics

mixins.ListModelMixin,   mixins.CreateModelMixin,

mixins.RetrieveModelMixin,   mixins.UpdateModelMixin,   mixins.DestroyModelMixin,

generics.GenericAPIView

  1. url(r'^authors/$',views.AuthorView.as_view(),name="author"),
  2. url(r'^authors/(?P<pk>\d+)',views.AuthorDetailView.as_view(),name="detail_author"),
  3.  
  4. -----------------------------------------
  5.  
  6. ######################### mixin类编写视图 ##############################
  7.  
  8. from rest_framework import mixins, generics
  9.  
  10. class AuthorView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
  11. queryset = Author.objects.all()
  12. serializer_class = AuthorModelSerializers
  13.  
  14. def get(self, request, *args, **kwargs):
  15. return self.list(request, *args, **kwargs)
  16.  
  17. def post(self, request, *args, **kwargs):
  18. return self.create(request, *args, **kwargs)
  19.  
  20. class AuthorDetailView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin,
  21. generics.GenericAPIView):
  22. queryset = Author.objects.all()
  23. serializer_class = AuthorModelSerializers
  24.  
  25. def get(self, request, *args, **kwargs):
  26. return self.retrieve(request, *args, **kwargs)
  27.  
  28. def put(self, request, *args, **kwargs):
  29. return self.update(request, *args, **kwargs)
  30.  
  31. def delete(self, request, *args, **kwargs):
  32. return self.destroy(request, *args, **kwargs)
  33.  
  34. ------------------------------------------------
  35.  
  36. class AuthorModelSerializers(serializers.ModelSerializer):
  37. class Meta:
  38. model = Author
  39. fields = "__all__"

2. 使用通用的基于类的视图

from rest_framework import generics

generics.ListCreateAPIView

generics.RetrieveUpdateDestroyAPIView

通过使用mixin类,我们使用更少的代码重写了这些视图,但我们还可以再进一步。REST框架提供了一组已经混合好(mixed-in)的通用视图,我们可以使用它来简化我们的views.py模块。

  1. ######################### 使用通用得基于类得视图 ##############################
  2.  
  3. from rest_framework import generics
  4.  
  5. class AuthorView(generics.ListCreateAPIView):
  6. queryset = Author.objects.all()
  7. serializer_class = AuthorModelSerializers
  8.  
  9. class AuthorDetailView(generics.RetrieveUpdateDestroyAPIView):
  10. queryset = Author.objects.all()
  11. serializer_class = AuthorModelSerializers

3. viewsets.ModelViewSet

views.AuthorModelView.as_view({"get": "list", "post": "create"})

views.AuthorModelView.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})

from rest_framework  import viewsets

viewsets.ModelViewSet

  1. url(r'^authors/$', views.AuthorModelView.as_view({"get": "list", "post": "create"}), name="author"),
  2. url(r'^authors/(?P<pk>\d+)',
  3. views.AuthorModelView.as_view({"get": "retrieve", "put": "update", "delete": "destroy"}), name="detail_author"),
  4.  
  5. ---------------------------------------------------
  6.  
  7. ######################### viewsets.ModelViewSet ##############################
  8.  
  9. from rest_framework import viewsets
  10.  
  11. class AuthorModelView(viewsets.ModelViewSet):
  12. queryset = Author.objects.all()
  13. serializer_class = AuthorModelSerializers
  14.  
  15.   # 可重写,覆盖!  
      # def list(self,request,*args,**kwargs):pass

效果:

get  post  get  put  delete  都可访问!

  

  1. http://www.cnblogs.com/yuanchenqi/articles/8719520.html
  2. 视图三部曲
  3. 5中方法: 查(全部) 查(单条)
  4. 逻辑封装起来了
  5.  
  6. -----------------------------------
  7.  
  8. class AuthorModelView(viewsets.ModelViewSet):
  9. queryset = Author.objects.all()
  10. serializer_class = AuthorModelSerializers
  11.  
  12. (1):url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}), name='author'),
  13. (2):url(r'^authors/$', ViewSetMixin.as_view({"get":"list","post":"create"}), name='author'),
  14. (3):url(r'^authors/$', ViewsetMixin.View, name='author'),
  15.  
  16. 一旦用户 get 方式 访问 authors
  17. ViewsetMixin.View():
  18. for method, action in actions.items(): # {"get":"list","post":"create"}
  19. handler = getattr(self, action) # self.list self.create
  20. setattr(self, method, handler) # self.get = self.list self.post = self.create
  21.  
  22. # getattr(self,"get") # self.list
  23. # getattr(self,"post") # self.create
  24.  
  25. return self.dispatch()
  26.  
  27. APIView.dispatch():
  28. if request.method.lower() in self.http_method_names:
  29. handler = getattr(self,request.method.lower())
  30. response = handler(request,*args,**kwargs) # self.list()
  31.  
  32. return response
  33.  
  34. (ViewSetMixin)

小总结 - 笔记

二、认证组件

生成随机字符串

  1. import hashlib, time
  2.  
  3. def get_random_str(user):
  4. """ 生成随机 字符串 """
  5. ctime = str(time.time())
  6.  
  7. md5 = hashlib.md5(bytes(user,encoding='utf-8'))
  8. md5.update(bytes(ctime,encoding="utf-8"))
  9.  
  10. return md5.hexdigest()

update_or_create

  1. # update_or_create
  2. Token.objects.update_or_create(user=user,defaults={"token":random_str})

返回json

  1. # import json
  2. # from django.shortcuts import HttpResponse
  3. # return HttpResponse(json.dumps(res,ensure_ascii=False))
  4.  
  5. # from django.http import JsonResponse
  6. # return JsonResponse(res)
  7.  
  8. return Response(res)

登录,生成随机token

  1. url(r'^login/$', views.LoginView.as_view(), name="login")
  2.  
  3. ---------------------------------------------
  4.  
  5. import hashlib, time
  6.  
  7. def get_random_str(user):
  8. """ 生成随机 字符串 """
  9. ctime = str(time.time())
  10.  
  11. md5 = hashlib.md5(bytes(user,encoding='utf-8'))
  12. md5.update(bytes(ctime,encoding="utf-8"))
  13.  
  14. return md5.hexdigest()
  15.  
  16. class LoginView(APIView):
  17. def post(self,request):
  18. name = request.data.get("name")
  19. pwd = request.data.get("pwd")
  20.  
  21. user = User.objects.filter(name=name,pwd=pwd).first()
  22. res = {"state_code":1000,"msg":None}
  23. if user:
  24. random_str = get_random_str(user.name)
  25. # update_or_create
  26. Token.objects.update_or_create(user=user,defaults={"token":random_str})
  27. res["token"] = random_str
  28. else:
  29. res["state_code"] = 1001 # 错误状态码
  30. res["msg"] = "用户名或密码错误"
  31.  
  32. # import json
  33. # from django.shortcuts import HttpResponse
  34. # return HttpResponse(json.dumps(res,ensure_ascii=False))
  35.  
  36. # from django.http import JsonResponse
  37. # return JsonResponse(res)
  38.  
  39. return Response(res)
  40.  
  41. --------------------------------------------------------
  42.  
  43. # models.py
  44.  
  45. class User(models.Model):
  46. name = models.CharField(max_length=32)
  47. pwd = models.CharField(max_length=32)
  48.  
  49. class Token(models.Model):
  50. user = models.OneToOneField("User")
  51. token = models.CharField(max_length=128)
  52.  
  53. def __str__(self):
  54. return self.token

效果图:

 

登录验证 - 局部

authentication_classes = [TokenAuth]

from rest_framework import exceptions

from rest_framework.authentication import BaseAuthentication

def authenticate(self,request):

  ... ...

  if not token_obj:

     raise exceptions.AuthenticationFailed("验证失败")

  return (token_obj.user.name, token_obj)

  1. from rest_framework import exceptions
  2.  
  3. # class TokenAuth(object):
  4. # def authenticate(self,request):
  5. # token = request.GET.get("token")
  6. # token_obj = Token.objects.filter(token=token).first()
  7. # if not token_obj:
  8. # raise exceptions.AuthenticationFailed("验证失败")
  9. #
  10. # return (token_obj.user.name, token_obj)
  11. #
  12. # def authenticate_header(self,request):
  13. # pass
  14.  
  15. from rest_framework.authentication import BaseAuthentication
  16.  
  17. class TokenAuth(BaseAuthentication):
  18. def authenticate(self,request):
  19. token = request.GET.get("token")
  20. token_obj = Token.objects.filter(token=token).first()
  21. if not token_obj:
  22. raise exceptions.AuthenticationFailed("验证失败")
  23.  
  24. return (token_obj.user.name, token_obj)
  25.  
  26. class BookView(APIView):
  27. authentication_classes = [TokenAuth]
  28. def get(self, request):
  29. book_list = Book.objects.all()
  30. ret = BookModelSerializers(book_list, many=True, context={"request": request})
  31. return Response(ret.data)
  32.  
  33. def post(self, request):
  34. bms = BookModelSerializers(data=request.data, many=False, context={"request": request})
  35. if bms.is_valid():
  36. bms.save()
  37. return Response(bms.data)
  38. else:
  39. return Response(bms.errors)

登录验证 - 全局

settings 配置

  'DEFAULT_AUTHENTICATION_CLASSES': ['app01.utils.TokenAuth']

  1. # settings.py
  2.  
  3. REST_FRAMEWORK = {
  4. 'DEFAULT_AUTHENTICATION_CLASSES': ['app01.utils.TokenAuth']
  5. }
  6.  
  7. -------------------------------------------
  8. # app01.utils
  9.  
  10. from .models import *
  11. from rest_framework import exceptions
  12. from rest_framework.authentication import BaseAuthentication
  13.  
  14. class TokenAuth(BaseAuthentication):
  15. def authenticate(self,request):
  16. token = request.GET.get("token")
  17. token_obj = Token.objects.filter(token=token).first()
  18. if not token_obj:
  19. raise exceptions.AuthenticationFailed("验证失败")
  20.  
  21. return (token_obj.user.name, token_obj)
  22.  
  23. --------------------------------------------
  24. # views.py
  25.  
  26. class BookView(APIView):
  27. def get(self, request):
  28. book_list = Book.objects.all()
  29. ret = BookModelSerializers(book_list, many=True, context={"request": request})
  30. return Response(ret.data)
  31.  
  32. def post(self, request):
  33. bms = BookModelSerializers(data=request.data, many=False, context={"request": request})
  34. if bms.is_valid():
  35. bms.save()
  36. return Response(bms.data)
  37. else:
  38. return Response(bms.errors)
  39.  
  40. -----------------------------------------
  1. class AuthorModelView(viewsets.ModelViewSet):
    authentication_classes = [] # 加上这个,前提是全局有认证;加上这个,就走自己得,不认证了,自己没有,才走全局配置得!
  2.  
  3. queryset = Author.objects.all()
    serializer_class = AuthorModelSerializers

效果图:

     

三、权限组件

权限 - 局部

permission_classes = [SVIPPermission]

has_permission(self,request,view):pass   # 固定得写法,根据源码来写得!

authentication_classes = []                       # 登录页面 不需要验证,在全局配置得前提下

  1. class AuthorModelView(viewsets.ModelViewSet):
  2. authentication_classes = [TokenAuth]
  3. permission_classes = [SVIPPermission]
  4.  
  5. queryset = Author.objects.all()
  6. serializer_class = AuthorModelSerializers
  7.  
  8. ----------------------------------------------
  1. # app01.utils.SVIPPermission
  1. class SVIPPermission(object):
  2. message = "只有超级用户才能访问"
  3. def has_permission(self,request,view):
  4. username = request.user
  5. user_type = User.objects.filter(name=username).first().user_type
  6. if user_type == 3:
  7. return True
  8. else:
  9. return False
  10.  
  11. ----------------------------------------------
  12.  
  13. class LoginView(APIView):
  14. authentication_classes = []
  15. ...
  16.  
  17. ...

权限 - 全局

settings配置:

  'DEFAULT_PERMISSION_CLASSES': ['app01.utils.SVIPPermission']

  1. # settings.py
  2.  
  3. REST_FRAMEWORK = {
  4. 'DEFAULT_AUTHENTICATION_CLASSES': ['app01.utils.TokenAuth'],
  5. 'DEFAULT_PERMISSION_CLASSES': ['app01.utils.SVIPPermission']
  6. }

效果图:

四、频率组件

局部视图throttle

  1. class BookView(APIView):
  2. # authentication_classes = [TokenAuth]
  3. # permission_classes = [SVIPPermission]
  4. throttle_classes = [VisitRateThrottle]
  5.  
  6. 。。。 。。。
  7.  
  8. -----------------------------------------------
  9.  
  10. from rest_framework.throttling import BaseThrottle
  11.  
  12. VISIT_RECORD={}
  13. class VisitThrottle(BaseThrottle):
  14.  
  15. def __init__(self):
  16. self.history=None
  17.  
  18. def allow_request(self,request,view):
  19. remote_addr = request.META.get('REMOTE_ADDR')
  20. print(remote_addr)
  21. import time
  22. ctime=time.time()
  23.  
  24. if remote_addr not in VISIT_RECORD:
  25. VISIT_RECORD[remote_addr]=[ctime,]
  26. return True
  27.  
  28. history=VISIT_RECORD.get(remote_addr)
  29. self.history=history
  30.  
  31. while history and history[-1]<ctime-60:
  32. history.pop()
  33.  
  34. if len(history)<3:
  35. history.insert(0,ctime)
  36. return True
  37. else:
  38. return False
  39.  
  40. def wait(self):
  41. import time
  42. ctime=time.time()
  43. return 60-(ctime-self.history[-1])

全局视图throttle

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_AUTHENTICATION_CLASSES': ['app01.utils.TokenAuth'],
  3. 'DEFAULT_PERMISSION_CLASSES': ['app01.utils.SVIPPermission'],
  4. 'DEFAULT_THROTTLE_CLASSES': ['app01.utils.VisitThrottle'],
  5. }

内置throttle类

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_AUTHENTICATION_CLASSES': ['app01.utils.TokenAuth'],
  3. 'DEFAULT_PERMISSION_CLASSES': ['app01.utils.SVIPPermission'],
  4. 'DEFAULT_THROTTLE_CLASSES': ['app01.utils.VisitThrottle'],
  5. "DEFAULT_THROTTLE_RATES": {
  6. "visit_rate": "1/m",
  7. }
  8. }
  9.  
  10. ------------------------------------
  11.  
  12. from rest_framework.throttling import SimpleRateThrottle
  13. class VisitThrottle(SimpleRateThrottle):
  14.  
  15. scope="visit_rate"
  16. def get_cache_key(self, request, view):
  17.  
  18. return self.get_ident(request)

http://www.cnblogs.com/yuanchenqi/articles/8719520.html

五、解析器

  1. from rest_framework.parsers import JSONParser,FormParser,MultiPartParser,FileUploadParser
  2. """
  3. 默认得是 JSONParser FormParser MultiPartParser
  4. """
  5.  
  6. class BookView(APIView):
  7.  
  8. parser_classes = [JSONParser,FormParser]
  9.  
  10. ...

request类

  django的request类和rest-framework的request类的源码解析

局部视图

  1. from rest_framework.parsers import JSONParser,FormParser
  2. class PublishViewSet(generics.ListCreateAPIView):
  3. parser_classes = [FormParser,JSONParser]
  4. queryset = Publish.objects.all()
  5. serializer_class = PublshSerializers
  6. def post(self, request, *args, **kwargs):
  7. print("request.data",request.data)
  8. return self.create(request, *args, **kwargs)

全局视图

  1. REST_FRAMEWORK={
  2. "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
  3. "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],
  4. "DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",],
  5. "DEFAULT_THROTTLE_RATES":{
  6. "visit_rate":"5/m",
  7. },
  8. "DEFAULT_PARSER_CLASSES":['rest_framework.parsers.FormParser',]
  9. }

六、url路由控制

url(r'',include(routers.urls)),

from rest_framework import routers

routers = routers.DefaultRouter()

routers.register("authors",views.AuthorModelView)

  1. # urls.py
  2.  
  3. from django.conf.urls import url,include
  4. from django.contrib import admin
  5.  
  6. from app01 import views
  7.  
  8. from rest_framework import routers
  9. routers = routers.DefaultRouter()
  10. routers.register("authors",views.AuthorModelView)
  11.  
  12. urlpatterns = [
  13. url(r'^admin/', admin.site.urls),
  14. url(r'^publishes/$', views.PublishView.as_view(), name="publish"),
  15. url(r'^publishes/(?P<pk>\d+)/$', views.PublishDetailView.as_view(), name="detail_publish"),
  16. url(r"^books/$", views.BookView.as_view(), name="books"),
  17. url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view(), name="detail_book"),
  18.  
  19. # url(r'^authors/$',views.AuthorView.as_view(),name="author"),
  20. # url(r'^authors/(?P<pk>\d+)',views.AuthorDetailView.as_view(),name="detail_author"),
  21.  
  22. # url(r'^authors/$', views.AuthorModelView.as_view({"get": "list", "post": "create"}), name="author"),
  23. # url(r'^authors/(?P<pk>\d+)',
  24. # views.AuthorModelView.as_view({"get": "retrieve", "put": "update", "delete": "destroy"}), name="detail_author"),
  25.  
  26. url(r'',include(routers.urls)),
  27.  
  28. url(r'^login/$', views.LoginView.as_view(), name="login")
  29.  
  30. ]
  31.  
  32. ------------------------------------------
  33.  
  34. # views.py
  35.  
  36. from rest_framework import viewsets
  37.  
  38. class AuthorModelView(viewsets.ModelViewSet):
  39. queryset = Author.objects.all()
  40. serializer_class = AuthorModelSerializers

效果图

  

七、分页

pnp = MyPageNumberPagination()

books_page = pnp.paginate_queryset(book_list,request,self)

  1.  
  1. from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination
  2.  
  3. class MyPageNumberPagination(PageNumberPagination):
  4. page_size = 2
  5. page_query_param = "page"
  6. page_size_query_param = "size"
  7. max_page_size = 2 # 限制 size 得大小 不能超过多少!!
  8.  
  9. class MyLimitOffsetPagination(LimitOffsetPagination):
  10. default_limit = 1
  11.  
  12. ---------------------------
  13.  
  14. class BookView(APIView):def get(self, request):
  15.  
  16. book_list = Book.objects.all()
  17.  
  18. pnp = MyPageNumberPagination()
  19. # pnp = MyLimitOffsetPagination()
  20.  
  21. books_page = pnp.paginate_queryset(book_list,request,self)
  22.  
  23. # ret = BookModelSerializers(book_list, many=True, context={"request": request})
  24. ret = BookModelSerializers(books_page, many=True)
  25.  
  26. # return Response(ret.data)
        
  1.      return pnp.get_paginated_response(ret.data)
  1. from rest_framework import viewsets
  2.  
  3. class AuthorModelView(viewsets.ModelViewSet):
  4. queryset = Author.objects.all()
  5. serializer_class = AuthorModelSerializers
  6.  
  7. pagination_class = MyPageNumberPagination

效果图

  1. day99
  2.  
  3. 1 CBV
  4.  
  5. 2 APIView
  6. class BookViewAPIView):pass
  7. url(r'^books/$', views.BookView.as_view(),name="books"),
  8. url(r'^books/$', View类下的view,name="books"),
  9. 一旦访问books/: view(request)======APIView类下的dispatch()====请求方式对应的示例方法()
  10.  
  11. 3 def dispatch():
  12. #一 初始化操作
  13. # (1) 构建新的request:
  14. self.request=self.initial_request()
  15. # self.request._request
  16. # self.request.GET
  17. # self.request.data
  18. # (2) 执行组件
  19. # 认证,权限,频率
  20. # 认证:request.user
  21. self.initial(request, *args, **kwargs)
  22. ==== # 认证组件
  23. self.perform_authentication(request)
  24. ==== request.user
  25. =====
  26. for authenticator in self.authenticators: # [TokenAuth(),]
  27. try:
  28. user_auth_tuple = authenticator.authenticate(self)
  29. except exceptions.APIException:
  30. self._not_authenticated()
  31. raise
  32.  
  33. if user_auth_tuple is not None:
  34. self._authenticator = authenticator
  35. self.user, self.auth = user_auth_tuple
  36. return
  37.  
  38. # 权限组件
  39. self.check_permissions(request)
  40. ===========
  41. for permission in self.get_permissions():
  42. if not permission.has_permission(request, self):
  43. self.permission_denied(
  44. request, message=getattr(permission, 'message', None)
  45. )
  46.  
  47. # 频率组件
  48. self.check_throttles(request)
  49.  
  50. =============
  51. for throttle in self.get_throttles(): # [VisitRateThrottle(),]
  52. if not throttle.allow_request(request, self):
  53. self.throttled(request, throttle.wait()) # 受限制
  54.  
  55. # 分发
  56. if request.method.lower() in self.http_method_names:
  57. handler = getattr(self,request.method.lower(),
  58. self.http_method_not_allowed)
  59.  
  60. response = handler(request, *args, **kwargs)
  61.  
  62. return response
  63.  
  64. 4 序列化组件
  65.  
  66. class PublishSerializers(serializers.Serializer):
  67. name = serializers.CharField()
  68. email = serializers.CharField()
  69.  
  70. class PublishModelSerializers(serializers.ModelSerializer):
  71. class Meta:
  72. model=Publish
  73. fields="__all__"
  74.  
  75. # queryset或者model对象-------------》json数据
  76. ps=PublishSerializers(queryset,many=True)
  77. ps.data # [{},{},{}]
  78.  
  79. ps=PublishSerializers(model_obj,many=False)
  80. ps.data # {}
  81.  
  82. # json数据-------》记录
  83. # 添加操作
  84. ps=PublishSerializers(data=request.data)
  85. if ps.is_valid():
  86. ps.save() # create
  87.  
  88. # 更新操作
  89.  
  90. ps=PublishSerializers(model_obj,data=request.data)
  91. if ps.is_valid():
  92. ps.save() # update
  93.  
  94. 5 视图组件
  95. # 版本1:
  96. # Book表
  97. class BookView(APIView):
  98.  
  99. def get(self,request):
  100. book_list=Book.objects.all()
  101. bs=BookModelSerializers(book_list,many=True,context={'request': request})
  102. return Response(bs.data)
  103. def post(self,request):
  104. # post请求的数据
  105. bs=BookModelSerializers(data=request.data)
  106. if bs.is_valid():
  107. print(bs.validated_data)
  108. bs.save()# create方法
  109. return Response(bs.data)
  110. else:
  111. return Response(bs.errors)
  112.  
  113. class BookDetailView(APIView):
  114.  
  115. def get(self,request,id):
  116.  
  117. book=Book.objects.filter(pk=id).first()
  118. bs=BookModelSerializers(book,context={'request': request})
  119. return Response(bs.data)
  120.  
  121. def put(self,request,id):
  122. book=Book.objects.filter(pk=id).first()
  123. bs=BookModelSerializers(book,data=request.data)
  124. if bs.is_valid():
  125. bs.save()
  126. return Response(bs.data)
  127. else:
  128. return Response(bs.errors)
  129.  
  130. def delete(self,request,id):
  131. Book.objects.filter(pk=id).delete()
  132.  
  133. return Response()
  134.  
  135. # 版本2:mixIn
  136.  
  137. from rest_framework import mixins
  138. from rest_framework import generics
  139.  
  140. class AuthorView(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):
  141. queryset=Author.objects.all()
  142. serializer_class =AuthorModelSerializers
  143.  
  144. def get(self,request, *args, **kwargs):
  145. return self.list(request, *args, **kwargs)
  146. def post(self,request, *args, **kwargs):
  147. return self.create(request, *args, **kwargs)
  148.  
  149. class AuthorDetailView(mixins.RetrieveModelMixin,mixins.DestroyModelMixin,mixins.UpdateModelMixin,generics.GenericAPIView):
  150. queryset = Author.objects.all()
  151. serializer_class = AuthorModelSerializers
  152.  
  153. def get(self,request,*args, **kwargs):
  154. return self.retrieve(request,*args, **kwargs)
  155.  
  156. def delete(self,request,*args, **kwargs):
  157. return self.destroy(request,*args, **kwargs)
  158.  
  159. def put(self,request,*args, **kwargs):
  160. return self.retrieve(request,*args, **kwargs)
  161.  
  162. # 版本3:基于通用类
  163. from rest_framework import mixins
  164. from rest_framework import generics
  165.  
  166. class AuthorView(generics.ListCreateAPIView):
  167. queryset=Author.objects.all()
  168. serializer_class =AuthorModelSerializers
  169.  
  170. class AuthorDetailView(generics.RetrieveUpdateDestroyAPIView):
  171. queryset = Author.objects.all()
  172. serializer_class = AuthorModelSerializers
  173.  
  174. # 版本4
  175. class AuthorModelView(viewsets.ModelViewSet):
  176. queryset = Author.objects.all()
  177. serializer_class = AuthorModelSerializers
  178.  
  179. url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
  180. url(r'^authors/(?P<pk>\d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put"
  181.  
  182. 流程:
  183. url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
  184. url(r'^authors/$', ViewSetMixin.as_view({"get":"list","post":"create"}),name="author"),
  185. url(r'^authors/$', ViewSetMixin类下的view),
  186. 一旦访问 /authors/:
  187. ViewSetMixin
  188. def view():
  189. for method, action in actions.items(): # {"get":"list","post":"create"}
  190. handler = getattr(self, action) # self.list self.create
  191. setattr(self, method, handler)
  192.  
  193. self.dispatch(request, *args, **kwargs)
  194.  
  195. APIView类下的self.dispatch
  196. # 分发
  197. if request.method.lower() in self.http_method_names:
  198. handler = getattr(self,request.method.lower(),
  199. self.http_method_not_allowed)
  200.  
  201. response = handler(request, *args, **kwargs) # self.list()
  202.  
  203. return response
  204.  
  205. 6 认证权限频率 组件
  206.  
  207. request.META:
  208. {'ALLUSERSPROFILE': 'C:\\ProgramData',
  209. 'APPDATA': 'C:\\Users\\Administrator\\AppData\\Roaming',
  210. 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files',
  211. 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files',
  212. 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files',
  213. 'COMPUTERNAME': 'PC201712041709',
  214. 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe',
  215. 'DJANGO_SETTINGS_MODULE': 'restdemo.settings',
  216. 'FP_NO_HOST_CHECK': 'NO', 'HOMEDRIVE': 'C:',
  217. 'HOMEPATH': '\\Users\\Administrator',
  218. 'LOCALAPPDATA': 'C:\\Users\\Administrator\\AppData\\Local',
  219. 'LOGONSERVER': '\\\\PC201712041709',
  220. 'NUMBER_OF_PROCESSORS': '', 'OS': 'Windows_NT',
  221. 'PATH': 'C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36;C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\Scripts;C:\\Python27;E:\\MySQL Server 5.6\\bin;C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\Scripts\\;C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\;C:\\Users\\Administrator\\AppData\\Local\\atom\\bin',
  222. 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC',
  223. 'PROCESSOR_ARCHITECTURE': 'AMD64',
  224. 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 60 Stepping 3, GenuineIntel',
  225. 'PROCESSOR_LEVEL': '', 'PROCESSOR_REVISION': '3c03',
  226. 'PROGRAMDATA': 'C:\\ProgramData',
  227. 'PROGRAMFILES': 'C:\\Program Files',
  228. 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)',
  229. 'PROGRAMW6432': 'C:\\Program Files',
  230. 'PSMODULEPATH': 'C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\',
  231. 'PUBLIC': 'C:\\Users\\Public', 'PYCHARM_HOSTED': '', 'PYTHONIOENCODING': 'UTF-8',
  232. 'PYTHONPATH': 'C:\\Users\\Administrator\\PycharmProjects\\s9\\restdemo', 'PYTHONUNBUFFERED': '',
  233. 'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\\Windows',
  234. 'TEMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp', 'TMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp',
  235. 'USERDOMAIN': 'PC201712041709',
  236. 'USERNAME': 'Administrator',
  237. 'USERPROFILE': 'C:\\Users\\Administrator',
  238. 'WINDIR': 'C:\\Windows', 'WINDOWS_TRACING_FLAGS': '',
  239. 'WINDOWS_TRACING_LOGFILE': 'C:\\BVTBin\\Tests\\installpackage\\csilogfile.log',
  240. 'RUN_MAIN': 'true', 'SERVER_NAME': 'PC201712041709',
  241. 'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '',
  242. 'REMOTE_HOST': '',
  243. 'CONTENT_LENGTH': '',
  244. 'SCRIPT_NAME': '',
  245. 'SERVER_PROTOCOL': 'HTTP/1.1',
  246. 'SERVER_SOFTWARE': 'WSGIServer/0.2',
  247. 'REQUEST_METHOD': 'GET',
  248. 'PATH_INFO': '/authors/',
  249. 'QUERY_STRING': 'token=8204b8e3ac40bf59ae480d17c146b51a',
  250. 'REMOTE_ADDR': '127.0.0.1',
  251. 'CONTENT_TYPE': 'text/plain',
  252. 'HTTP_HOST': '127.0.0.1:8000',
  253. 'HTTP_CONNECTION': 'keep-alive',
  254. 'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
  255. 'HTTP_UPGRADE_INSECURE_REQUESTS': '',
  256. 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  257. 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.9', 'HTTP_COOKIE': 'csrftoken=jtus3l4GJEc9TFXWYCWxkBIZprcOv7C1vFMIyOHs7Zkxt015FwVZ2KEEeDV6LOyN', 'wsgi.input': <_io.BufferedReader name=832>, 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>, 'wsgi.version': (1, 0), 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>}
  258.  
  259. 7 解析器-----数据解析器
  260. from rest_framework.parsers import JSONParser,FormParser,MultiPartParser,FileUploadParser
  261. parser_classes = [JSONParser,FormParser]
  262.  
  263. 8 路由控制
  264. 针对:
  265. url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
  266. url(r'^authors/(?P<pk>\d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailauthor"),
  267.  
  268. class AuthorModelView(viewsets.ModelViewSet):
  269.  
  270. queryset = Author.objects.all()
  271. serializer_class = AuthorModelSerializers
  272.  
  273. url(r'^books/$', views.BookModelView.as_view({"get":"list","post":"create"}),name="author"),
  274. url(r'^books/(?P<pk>\d+)/$', views.BookModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailbook"),
  275.  
  276. class AuthorModelView(viewsets.ModelViewSet):
  277.  
  278. queryset = Author.objects.all()
  279. serializer_class = AuthorModelSerializers
  280.  
  281. 9 分页
  282.  
  283. 10 响应器 Response

总结 - 笔记

  1. REST_FRAMEWORK = {
  2. # 'DEFAULT_AUTHENTICATION_CLASSES': ['app01.utils.TokenAuth'],
  3. # 'DEFAULT_PERMISSION_CLASSES': ['app01.utils.SVIPPermission'],
  4. # 'DEFAULT_THROTTLE_CLASSES': ['app01.utils.VisitThrottle'],
  5. # "DEFAULT_THROTTLE_RATES": {
  6. # "visit_rate": "1/m",
  7. # }
  8. # "PAGE_SIZE":2
  9. }

settings.py

  1. from django.conf.urls import url,include
  2. from django.contrib import admin
  3.  
  4. from app01 import views
  5.  
  6. from rest_framework import routers
  7. routers = routers.DefaultRouter()
  8. routers.register("authors",views.AuthorModelView)
  9.  
  10. urlpatterns = [
  11. url(r'^admin/', admin.site.urls),
  12. url(r'^publishes/$', views.PublishView.as_view(), name="publish"),
  13. url(r'^publishes/(?P<pk>\d+)/$', views.PublishDetailView.as_view(), name="detail_publish"),
  14. url(r"^books/$", views.BookView.as_view(), name="books"),
  15. url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view(), name="detail_book"),
  16.  
  17. # url(r'^authors/$',views.AuthorView.as_view(),name="author"),
  18. # url(r'^authors/(?P<pk>\d+)',views.AuthorDetailView.as_view(),name="detail_author"),
  19.  
  20. # url(r'^authors/$', views.AuthorModelView.as_view({"get": "list", "post": "create"}), name="author"),
  21. # url(r'^authors/(?P<pk>\d+)',
  22. # views.AuthorModelView.as_view({"get": "retrieve", "put": "update", "delete": "destroy"}), name="detail_author"),
  23.  
  24. url(r'',include(routers.urls)),
  25.  
  26. url(r'^login/$', views.LoginView.as_view(), name="login")
  27.  
  28. ]

urls.py

  1. from .models import *
  2. from rest_framework import exceptions
  3. from rest_framework.authentication import BaseAuthentication
  4.  
  5. class TokenAuth(BaseAuthentication):
  6. def authenticate(self,request):
  7. token = request.GET.get("token")
  8. token_obj = Token.objects.filter(token=token).first()
  9. if not token_obj:
  10. raise exceptions.AuthenticationFailed("验证失败")
  11.  
  12. return (token_obj.user.name, token_obj)
  13.  
  14. class SVIPPermission(object):
  15. message = "只有超级用户才能访问"
  16. def has_permission(self,request,view):
  17. username = request.user
  18. user_type = User.objects.filter(name=username).first().user_type
  19. if user_type == 3:
  20. return True
  21. else:
  22. return False
  23.  
  24. # from rest_framework.throttling import BaseThrottle
  25. #
  26. # VISIT_RECORD={}
  27. # class VisitThrottle(BaseThrottle):
  28. #
  29. # def __init__(self):
  30. # self.history=None
  31. #
  32. # def allow_request(self,request,view):
  33. # remote_addr = request.META.get('REMOTE_ADDR')
  34. # print(remote_addr)
  35. # import time
  36. # ctime=time.time()
  37. #
  38. # if remote_addr not in VISIT_RECORD:
  39. # VISIT_RECORD[remote_addr]=[ctime,]
  40. # return True
  41. #
  42. # history=VISIT_RECORD.get(remote_addr)
  43. # self.history=history
  44. #
  45. # while history and history[-1]<ctime-60:
  46. # history.pop()
  47. #
  48. # if len(history)<3:
  49. # history.insert(0,ctime)
  50. # return True
  51. # else:
  52. # return False
  53. #
  54. # def wait(self):
  55. # import time
  56. # ctime=time.time()
  57. # return 60-(ctime-self.history[-1])
  58.  
  59. from rest_framework.throttling import SimpleRateThrottle
  60. class VisitThrottle(SimpleRateThrottle):
  61.  
  62. scope="visit_rate"
  63. def get_cache_key(self, request, view):
  64.  
  65. return self.get_ident(request)

utils.py

  1. from django.shortcuts import render, HttpResponse
  2.  
  3. from django.views import View
  4. from .models import *
  5. import json
  6. from rest_framework import serializers
  7. from rest_framework.views import APIView
  8. from rest_framework.response import Response
  9.  
  10. # 为queryset,model 对象 做序列化得
  11. # class PublishSerializers(serializers.Serializer):
  12. # name = serializers.CharField()
  13. # email = serializers.CharField()
  14.  
  15. class PublishModelSerializers(serializers.ModelSerializer):
  16. class Meta:
  17. model = Publish
  18. fields = "__all__"
  19.  
  20. class BookModelSerializers(serializers.ModelSerializer):
  21. class Meta:
  22. model = Book
  23. fields = "__all__"
  24.  
  25. # 显示超链接
  26. publish = serializers.HyperlinkedIdentityField(
  27. view_name='detailpublish', # 别名 含正则表达式
  28. lookup_field= 'publish_id',
  29. lookup_url_kwarg='pk'
  30.  
  31. )
  32.  
  33. # publish = serializers.CharField(source="publish.pk")
  34. # publish = serializers.CharField()
  35. # authors = serializers.CharField(source="authors.all")
  36. # authors = serializers.SerializerMethodField()
  37. # def get_authors(self,obj):
  38. # temp = []
  39. # for obj in obj.authors.all():
  40. # temp.append(obj.name)
  41. # return temp
  42.  
  43. # def create(self, validated_data):
  44. # print('--->',validated_data)
  45. # book = Book.objects.create(title=validated_data["title"],price=validated_data['price'],
  46. # pub_date=validated_data['pub_date'],publish_id=validated_data['publish']['pk'])
  47. # book.authors.add(*validated_data['authors'])
  48. #
  49. # return book
  50.  
  51. class AuthorModelSerializers(serializers.ModelSerializer):
  52. class Meta:
  53. model = Author
  54. fields = "__all__"

serializer.py

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class User(models.Model):
  6. name = models.CharField(max_length=32)
  7. pwd = models.CharField(max_length=32)
  8.  
  9. type_choices = ((1,"普通用户"),(2,"VIP"),(3,"SVIP"))
  10. user_type = models.IntegerField(choices=type_choices,default=1)
  11.  
  12. class Token(models.Model):
  13. user = models.OneToOneField("User")
  14. token = models.CharField(max_length=128)
  15.  
  16. def __str__(self):
  17. return self.token
  18.  
  19. class Book(models.Model):
  20. title = models.CharField(max_length=32)
  21. price = models.IntegerField()
  22. pub_date = models.DateField()
  23. publish = models.ForeignKey("Publish")
  24. authors = models.ManyToManyField("Author")
  25.  
  26. def __str__(self):
  27. return self.title
  28.  
  29. class Publish(models.Model):
  30. name = models.CharField(max_length=32)
  31. email = models.EmailField()
  32.  
  33. def __str__(self):
  34. return self.name
  35.  
  36. class Author(models.Model):
  37. name = models.CharField(max_length=32)
  38. age = models.IntegerField()
  39.  
  40. def __str__(self):
  41. return self.name

models.py

  1. from django.shortcuts import render,HttpResponse
  2.  
  3. # Create your views here.
  4.  
  5. from django.views import View
  6. from .models import *
  7. import json
  8. from rest_framework import serializers
  9. from rest_framework.views import APIView
  10. from rest_framework.response import Response
  11.  
  12. from app01.serializer import *
  13.  
  14. class PublishView(APIView):
  15. def get(self, request):
  16. publish_list = Publish.objects.all()
  17. ret = PublishModelSerializers(publish_list, many=True)
  18. return Response(ret.data)
  19.  
  20. def post(self, request):
  21. ps = PublishModelSerializers(data=request.data)
  22. if ps.is_valid():
  23. ps.save()
  24. return Response(ps.data)
  25. else:
  26. return Response(ps.errors)
  27.  
  28. class PublishDetailView(APIView):
  29. def get(self, request, pk):
  30. publish = Publish.objects.filter(pk=pk).first()
  31. ps = PublishModelSerializers(publish)
  32. return Response(ps.data)
  33.  
  34. def put(self, request, pk):
  35. publish = Publish.objects.filter(pk=pk).first()
  36. ps = PublishModelSerializers(publish, data=request.data)
  37. if ps.is_valid():
  38. ps.save()
  39. return Response(ps.data)
  40. else:
  41. return Response(ps.errors)
  42.  
  43. def delete(self, request, pk):
  44. Publish.objects.filter(pk=pk).delete()
  45. return Response()
  46.  
  47. from rest_framework.parsers import JSONParser,FormParser,MultiPartParser,FileUploadParser
  48. """
  49. 默认得是 JSONParser FormParser MultiPartParser
  50. """
  51. # Book
  52. from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination
  53. class MyPageNumberPagination(PageNumberPagination):
  54. page_size = 1
  55. page_query_param = "page"
  56. page_size_query_param = "size"
  57. max_page_size = 2 # 限制 size 得大小 不能超过多少!!
  58. # # http://127.0.0.1:8000/books/?page=2&size=2
  59.  
  60. class MyLimitOffsetPagination(LimitOffsetPagination):
  61. default_limit = 1
  62. # limit_query_param =
  63. # http://127.0.0.1:8000/books/?limit=2&offset=2
  64.  
  65. # 偏移
  66.  
  67. class BookView(APIView):
  68. # authentication_classes = [TokenAuth]
  69.  
  70. parser_classes = [JSONParser,FormParser]
  71.  
  72. def get(self,request):
  73.  
  74. print("user:--->", request.user)
  75. print(request.auth)
  76.  
  77. book_list = Book.objects.all()
  78.  
  79. # 分页 page_size 配置 setting 全局得 单独怎么设置? 写个类
  80. # from rest_framework.pagination import PageNumberPagination
  81.  
  82. # pnp = PageNumberPagination()
  83. # pnp = MyPageNumberPagination()
  84. pnp = MyLimitOffsetPagination()
  85.  
  86. books_page = pnp.paginate_queryset(book_list,request,self)
  87.  
  88. # bs = BookModelSerializers(book_list,many=True,context={'request': request})
  89. bs = BookModelSerializers(books_page,many=True,context={'request': request})
  90.  
  91. # return HttpResponse(bs.data)
  92. return Response(bs.data)
  93.  
  94. def post(self,request):
  95.  
  96. print('data:--->', request.data,type(request.data))
  97.  
  98. # post 请求的数据
  99. bs = BookModelSerializers(data=request.data,context={'request': request})
  100. if bs.is_valid():
  101. bs.save() # create 方法
  102. print(bs.validated_data)
  103. return Response(bs.data)
  104. else:
  105. return Response(bs.errors)
  106.  
  107. class BookDetailView(APIView):
  108. def get(self,request,id):
  109. book = Book.objects.filter(pk=id).first()
  110. # 序列化
  111. bs = BookModelSerializers(book)
  112. return Response(bs.data)
  113.  
  114. def put(self,request,id):
  115.  
  116. book = Book.objects.filter(pk=id).first()
  117. bs = BookModelSerializers(book,data=request.data)
  118. if bs.is_valid():
  119. bs.save()
  120. return Response(bs.data)
  121. else:
  122. return Response(bs.errors)
  123.  
  124. def delete(self,request,id):
  125. Book.objects.filter(pk=id).delete()
  126. return Response()
  127.  
  128. # Author
  129. # 逻辑复用
  130. # 三种方法
  131.  
  132. ######################### mixin类编写视图 ##############################
  133.  
  134. # from rest_framework import mixins, generics
  135. #
  136. # class AuthorView(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):
  137. # queryset = Author.objects.all()
  138. # serializer_class = AuthorModelSerializers
  139. #
  140. # def get(self,request,*args,**kwargs):
  141. # return self.list(request,*args,**kwargs)
  142. #
  143. # def post(self,request,*args,**kwargs):
  144. # return self.create(self, request, *args, **kwargs)
  145. #
  146. #
  147. # class AuthorDetailView(mixins.RetrieveModelMixin,mixins.DestroyModelMixin,mixins.UpdateModelMixin,generics.GenericAPIView):
  148. # queryset = Author.objects.all()
  149. # serializer_class = AuthorModelSerializers
  150. #
  151. # def get(self,request,pk,*args,**kwargs):
  152. # return self.retrieve(request,pk,*args,**kwargs)
  153. #
  154. # def delete(self,request,*args,**kwargs):
  155. # return self.destroy(request,*args,**kwargs)
  156. #
  157. # def put(self,request,*args,**kwargs):
  158. # return self.update(request,*args,**kwargs)
  159.  
  160. ######################### 使用得通用得基于类得视图 ##############################
  161.  
  162. # from rest_framework import mixins, generics
  163. #
  164. # class AuthorView(generics.ListCreateAPIView):
  165. # queryset = Author.objects.all()
  166. # serializer_class = AuthorModelSerializers
  167. #
  168. #
  169. # class AuthorDetailView(generics.RetrieveUpdateDestroyAPIView):
  170. # queryset = Author.objects.all()
  171. # serializer_class = AuthorModelSerializers
  172.  
  173. ######################### viewsets.ModelViewSet ##############################
  174. # url 需要是一趟线 走一个视图类
  175. # url 中 利用参数 来指定 什么方式 用什么方法 执行
  176. from .utils import TokenAuth,SVIPPermission
  177. from rest_framework import viewsets
  178.  
  179. class VisitRateThrottle(object):
  180. def allow_request(self,request,view):
  181. # 要求访问站点得频率不能超过每分钟20次
  182. if 1:
  183. # 每次来 存下来 比对一下,间隔多久 超过一分钟
  184. # IP, 请求首行(request.method request.path)
  185. # 请求头(request.meta) 请求体(request.body)
  186. print("meta:----->",request.META)
  187. print(request.META.get("REMOTE_ADDR")) # 客户端得ip 这里面 你要保存什么 ip 时间 记录下来;
  188. # 频率 限制 实现 功能!!!
  189.  
  190. return True
  191. else:
  192. return False
  193.  
  194. from rest_framework.response import Response
  195.  
  196. class AuthorModelView(viewsets.ModelViewSet):
  197.  
  198. # authentication_classes = [TokenAuth,]
  199. # permission_classes = [SVIPPermission,] 取配全局八
  200. # throttle_classes = [VisitRateThrottle]
  201.  
  202. queryset = Author.objects.all()
  203. serializer_class = AuthorModelSerializers
  204.  
  205. pagination_class = MyPageNumberPagination
  206.  
  207. # 完美! ok
  208.  
  209. # 类得继承 , 表示形式 需求 展示 数据 ,覆盖方法 单独写 类得继承 可重写 覆盖
  210. #
  211. # def list(self,request,*args,**kwargs):
  212. # pass
  213.  
  214. # ------------------------------------------------------
  215.  
  216. def get_random_str(user):
  217. import hashlib,time
  218. ctime=str(time.time())
  219.  
  220. md5=hashlib.md5(bytes(user,encoding="utf8"))
  221. md5.update(bytes(ctime,encoding="utf8"))
  222.  
  223. return md5.hexdigest()
  224.  
  225. class LoginView(APIView):
  226. authentication_classes = []
  227. def post(self,request):
  228. name = request.data.get("name")
  229. pwd = request.data.get("pwd")
  230. user = User.objects.filter(name=name,pwd=pwd).first()
  231. res = {"state_code":1000,"msg":None}
  232. if user:
  233. random_str = get_random_str(user.name)
  234. token = Token.objects.update_or_create(user=user,defaults={"token":random_str})
  235. res['token'] = random_str
  236. else:
  237. res["status_code"] = 1001 # 错误状态码
  238. res['msg'] = "用户名或密码错误"
  239.  
  240. import json
  241. return Response(json.dumps(res,ensure_ascii=False))

views.py

八、渲染器、版本

配置:

1.添加配置

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer','rest_framework.renderers.BrowsableAPIRenderer'],
  3. 'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
  4. 'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本
  5. 'VERSION_PARAM': 'version', # 参数
  6. 'DEFAULT_VERSION': 'v1', # 默认版本
  7. }

2.设置路由:

luffycity/urls.py

  1. from django.conf.urls import url,include
  2. from django.contrib import admin
  3.  
  4. urlpatterns = [
  5. # url(r'^admin/', admin.site.urls),
  6. url(r'^api/(?P<version>\w+)/', include('api.urls')),
  7. ]

api/urls.py

  1. from django.conf.urls import url
  2. from api.views import course
  3.  
  4. urlpatterns = [
  5. url(r'^course/$', course.CourseView.as_view()),
  6. ]

3.获取版本

  1. request.version 获取版本

Django - rest - framework - 下的更多相关文章

  1. 6- vue django restful framework 打造生鲜超市 -完成商品列表页(下)

    Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 商品列表页下 drf中的request和response drf对于django的 ...

  2. 使用django rest framework

    django 刚接触,想做一些restful api , google了一下,发现有现成的框架.Django REST framework. 对使用做下记录: 安装 从http://django-re ...

  3. django rest framework 入门

    django rest framework 入门1-序列化 Serialization 分类: Python 2013-01-22 22:24 11528人阅读 评论(0) 收藏 举报 djangop ...

  4. django rest framework

    Django-Rest-Framework 教程: 4. 验证和权限 作者: Desmond Chen, 发布日期: 2014-06-01, 修改日期: 2014-06-02 到目前为止, 我们的AP ...

  5. Django REST Framework学习——Android使用REST方法访问Diango

    本文更应该叫做Android如何模拟浏览器访问Django服务器后台. 环境为: Android通过HttpClient访问服务器,从Django中获取json数据,解析显示在UI界面上. 问题为: ...

  6. 用Django Rest Framework和AngularJS开始你的项目

    Reference: http://blog.csdn.net/seele52/article/details/14105445 译序:虽然本文号称是"hello world式的教程&quo ...

  7. Django REST FrameWork中文教程2:请求和响应

    从这一点开始,我们将真正开始覆盖REST框架的核心.我们来介绍几个基本的构建块. 请求对象REST框架引入了Request扩展常规的对象HttpRequest,并提供更灵活的请求解析.Request对 ...

  8. Django REST framework+Vue 打造生鲜超市(三)

    四.xadmin后台管理 4.1.xadmin添加富文本插件 (1)xadmin/plugins文件夹下新建文件ueditor.py 代码如下: # xadmin/plugins/ueditor.py ...

  9. Django REST framework+Vue 打造生鲜超市(四)

    五.商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django res ...

随机推荐

  1. HTC Desire 816刷机教程(图文)

    HTC Desire 816刷机教程也来了,今天在这里主要是来说说如何刷机的,这个刷机是采用卡刷的方式,也就是利用第三方的recovery来刷入第三方的zip包,因为第三方的zip包都是支持卡刷的,很 ...

  2. linux服务器检测CPU使用率、负载以及java占用CPU使用率的shell脚本

    #!/bin/bash CPU=`top -b -n 1|grep Cpu|awk '{print $2}'|cut -f 1 -d "."`LOAD=`top -b -n 1|g ...

  3. 第八章 示例代码(MyBatis)

    Sample Code JPetStore 6 is a full web application built on top of MyBatis 3, Spring 3 and Stripes. I ...

  4. jQuery实现鼠标选中文字后弹出提示窗口效果

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  5. 对ChemDraw Professional 16.0你了解多少

    ChemDraw Professional 16.0组件为科学家提供了最新的科学智能应用程序组件,绘制化学结构图和分析生物路径图.  ChemDraw Professional 16.0 ChemDr ...

  6. C#操作缓存--CacheHelper缓存帮助类

    /// <summary>/// 类说明:Assistant/// 联系方式:361983679  /// 更新网站:<a href=\"http://www.cckan. ...

  7. 关于截取字符串substr和substring两者的区别

    https://blog.csdn.net/adley_function/article/details/52130762 substr和substring两个都是截取字符串的. 两者有相同点,如果只 ...

  8. Extjs 自定义控件

    // JavaScript Document Ext.namespace('CRM.Panels'); CRM.Panels.UserDetail = Ext.extend(Ext.Panel,{ w ...

  9. 查看进程动态:top

    top命令用于查看进程动态,即进程使用系统资源的情况,常见用法如下: [root@localhost ~]$ top # 动态查看进程使用资源的情况,每三秒刷新一次 [root@localhost ~ ...

  10. select下拉框不能赋值

    前言: 需要用到类似于下面的下拉选择框,按照官方文档写,始终实现不了下拉框赋上值的情况. 过程: 认认真真的看了好几遍文档,但是还没找到原因,不过还是应该感谢自己加入的vue-admin的微信群,大家 ...