2018-10-30 20:25:23

终于学完了rest_framework  这个框架!

这个框架有一些基本组件!最重要的就是看源码!要一个类一个类的去找!按顺序!

并且要自己配置类的时候要先看源类里面的属性,然后覆盖原来属性!不要自定义名称!

要学习好的源码的思想和方式!封装思想要多用!

详情可以参考这个连接 https://www.cnblogs.com/yuanchenqi/articles/8719520.html  拿来主义!

主要看笔记,笔记很是重要!

越努力越幸运!永远不要高估自己!

贴上源码!有空多看看!下面开始进行 vue (前端知识) 后面该是路飞,还有flak!!有空还是得多整理博客!

只是配置好路由部分后访问url出来的页面

urls.py

  1. from django.conf.urls import url,include
  2. from django.contrib import admin
  3.  
  4. from rest_framework import routers
  5. from app01 import views
  6.  
  7. routers=routers.DefaultRouter()
  8. routers.register("authors",views.AuthorModelView)
  9.  
  10. urlpatterns = [
  11.  
  12. url(r'^admin/', admin.site.urls),
  13. url(r'^publishes/$', views.PublishView.as_view(),name="publish"), # View:view(request)=====APIView:dispatch()
  14. url(r'^publishes/(?P<pk>\d+)/$', views.PublishDetailView.as_view(),name="detailpublish"), # View:view(request)=====APIView:dispatch()
  15.  
  16. url(r'^books/$', views.BookView.as_view(),name="books"),
  17. url(r'^books/(\d+)/$', views.BookDetailView.as_view(),name="detailbook"),
  18. #url(r'^books/(\d+)/$', View:view), # view(request)
  19. # 利用指定参数 指定 什么请求方式由哪个内部方法执行
  20. # url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
  21. # 字典中请求方式 与 方法名相对
  22. # url(r'^authors/(?P<pk>\d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailauthor"),
  23. #
  24. url(r'', include(routers.urls)),
  25. url(r'^login/$', views.LoginView.as_view(),name="login"),
  26.  
  27. ]

app01/views.py

  1. from app01.serilizer import *
  2.  
  3. from rest_framework.views import APIView
  4.  
  5. # Publish表
  6. class PublishView(APIView):
  7. def get(self, request):
  8.  
  9. # restframework
  10. # 取数据
  11. # print("request.data", request.data)
  12. # print("request.data type", type(request.data))
  13. # print(request._request.GET)
  14. # print(request.GET)
  15. # 序列化
  16. # 方式1:
  17. # publish_list=list(Publish.objects.all().values("name","email"))
  18.  
  19. # 方式2:
  20. # from django.forms.models import model_to_dict
  21. # publish_list=Publish.objects.all()
  22. # temp=[]
  23. # for obj in publish_list:
  24. # temp.append(model_to_dict(obj))
  25.  
  26. # 方式3:
  27. # from django.core import serializers
  28. # ret=serializers.serialize("json",publish_list)
  29.  
  30. # 序列组件
  31. publish_list = Publish.objects.all()
  32. ps = PublishModelSerializers(publish_list, many=True)
  33. return Response(ps.data)
  34.  
  35. def post(self, request):
  36. # 取数据
  37. # 原生request支持的操作
  38. # print("POST",request.POST)
  39. # print("body",request.body)
  40. # # print(request)
  41. # print(type(request))
  42. # from django.core.handlers.wsgi import WSGIRequest
  43. # 新的request支持的操作
  44. # print("request.data",request.data)
  45. # print("request.data type",type(request.data))
  46.  
  47. #
  48. # post请求的数据
  49. ps = PublishModelSerializers(data=request.data)
  50. if ps.is_valid():
  51. print(ps.validated_data)
  52. ps.save() # create方法
  53. return Response(ps.data)
  54. else:
  55. return Response(ps.errors)
  56.  
  57. # publish类继承APIView 覆盖父类方法
  58. class PublishDetailView(APIView):
  59. def get(self, request, pk):
  60.  
  61. publish = Publish.objects.filter(pk=pk).first()
  62. ps = PublishModelSerializers(publish)
  63. return Response(ps.data)
  64.  
  65. def put(self, request, pk):
  66. publish = Publish.objects.filter(pk=pk).first()
  67. ps = PublishModelSerializers(publish, data=request.data)
  68. if ps.is_valid():
  69. ps.save()
  70. return Response(ps.data)
  71. else:
  72. return Response(ps.errors)
  73.  
  74. def delete(self, request, pk):
  75. Publish.objects.filter(pk=pk).delete()
  76.  
  77. return Response()
  78.  
  79. from rest_framework.parsers import JSONParser, FormParser, MultiPartParser, FileUploadParser
  80. # Book表
  81.  
  82. # 引入rest_framework 分页组件
  83. from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination
  84.  
  85. # 设置一个配置类继承PageNumberPagination
  86. class MyPageNumberPagination(PageNumberPagination):
  87. page_size = 1
  88. page_query_param = 'page'
  89. page_size_query_param = "size"
  90. max_page_size = 2
  91.  
  92. # 另外一种的偏移分页
  93. class MyLimitOffsetPagination(LimitOffsetPagination):
  94. default_limit = 1
  95.  
  96. # Book表
  97. class BookView(APIView):
  98. # authentication_classes = [TokenAuth,] # [TokenAuth(),]
  99. # permission_classes = []
  100. # throttle_classes = []
  101. parser_classes = [JSONParser, FormParser]
  102.  
  103. def get(self, request):
  104. print("request.user", request.user)
  105. print("request.auth", request.auth)
  106. print("_request.body", request._request.body)
  107. print("_request.GET", request._request.GET)
  108. book_list = Book.objects.all()
  109.  
  110. # 分页
  111.  
  112. pnp = MyLimitOffsetPagination()
  113. books_page = pnp.paginate_queryset(book_list, request, self)
  114.  
  115. bs = BookModelSerializers(books_page, many=True, context={'request': request})
  116. return Response(bs.data)
  117.  
  118. def post(self, request):
  119. # post请求的数据
  120.  
  121. print("request.data", request.data)
  122.  
  123. bs = BookModelSerializers(data=request.data)
  124. if bs.is_valid():
  125. print(bs.validated_data)
  126. bs.save() # create方法
  127. return Response(bs.data)
  128. else:
  129. return Response(bs.errors)
  130.  
  131. # Book表类继承APIView 覆盖父类方法
  132. class BookDetailView(APIView):
  133.  
  134. def get(self, request, id):
  135.  
  136. book = Book.objects.filter(pk=id).first()
  137.  
  138. bs = BookModelSerializers(book, context={'request': request})
  139.  
  140. return Response(bs.data)
  141.  
  142. def put(self, request, id):
  143. book = Book.objects.filter(pk=id).first()
  144. bs = BookModelSerializers(book, data=request.data)
  145. if bs.is_valid():
  146. bs.save()
  147. return Response(bs.data)
  148. else:
  149. return Response(bs.errors)
  150.  
  151. def delete(self, request, id):
  152. Book.objects.filter(pk=id).delete()
  153.  
  154. return Response()
  155.  
  156. # ##############################################################Author
  157.  
  158. # from rest_framework import mixins
  159. # from rest_framework import generics
  160. #
  161. # class AuthorView(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):
  162. # queryset=Author.objects.all()
  163. # serializer_class =AuthorModelSerializers
  164. #
  165. # def get(self,request, *args, **kwargs):
  166. # return self.list(request, *args, **kwargs)
  167. # def post(self,request, *args, **kwargs):
  168. # return self.create(request, *args, **kwargs)
  169. #
  170. #
  171. # class AuthorDetailView(mixins.RetrieveModelMixin,mixins.DestroyModelMixin,mixins.UpdateModelMixin,generics.GenericAPIView):
  172. # queryset = Author.objects.all()
  173. # serializer_class = AuthorModelSerializers
  174. #
  175. # def get(self,request,*args, **kwargs):
  176. # return self.retrieve(request,*args, **kwargs)
  177. #
  178. # def delete(self,request,*args, **kwargs):
  179. # return self.destroy(request,*args, **kwargs)
  180. #
  181. # def put(self,request,*args, **kwargs):
  182. # return self.retrieve(request,*args, **kwargs)
  183.  
  184. ##############################################################################
  185.  
  186. #
  187. # from rest_framework import mixins
  188. # from rest_framework import generics
  189. #
  190. #
  191. # class AuthorView(generics.ListCreateAPIView):
  192. # queryset=Author.objects.all()
  193. # serializer_class =AuthorModelSerializers
  194. #
  195. # class AuthorDetailView(generics.RetrieveUpdateDestroyAPIView):
  196. # queryset = Author.objects.all()
  197. # serializer_class = AuthorModelSerializers
  198.  
  199. ##############################################################################
  200.  
  201. from rest_framework import viewsets
  202.  
  203. # 频率组件
  204. class VisitRateThrottle(object):
  205. def allow_request(self, request, view):
  206. # 要求访问站点的频率不能超过每分钟20次
  207. if 1:
  208. print(request.META.get("REMOTE_ADDR"))
  209.  
  210. return True
  211. else:
  212. return False
  213.  
  214. from rest_framework.response import Response
  215.  
  216. class AuthorModelView(viewsets.ModelViewSet):
  217. # authentication_classes = [TokenAuth,]
  218. # permission_classes=[SVIPPermission,]
  219. # throttle_classes = [VisitRateThrottle] # 限制某个IP每分钟访问次数不能超过20次
  220. queryset = Author.objects.all()
  221. serializer_class = AuthorModelSerializers
  222. pagination_class = MyPageNumberPagination
  223. renderer_classes = []
  224.  
  225. # 生成一个随机token的类
  226. def get_random_str(user):
  227. import hashlib, time
  228. ctime = str(time.time())
  229.  
  230. md5 = hashlib.md5(bytes(user, encoding="utf8"))
  231. md5.update(bytes(ctime, encoding="utf8"))
  232.  
  233. return md5.hexdigest()
  234.  
  235. from .models import User
  236.  
  237. # 手写原生的 login视图
  238. class LoginView(APIView):
  239. authentication_classes = []
  240.  
  241. def post(self, request):
  242.  
  243. name = request.data.get("name")
  244. pwd = request.data.get("pwd")
  245. user = User.objects.filter(name=name, pwd=pwd).first()
  246. res = {"state_code": 1000, "msg": None}
  247. if user:
  248.  
  249. random_str = get_random_str(user.name)
  250. token = Token.objects.update_or_create(user=user, defaults={"token": random_str})
  251. res["token"] = random_str
  252. else:
  253. res["state_code"] = 1001 # 错误状态码
  254. res["msg"] = "用户名或者密码错误"
  255.  
  256. import json
  257. return Response(json.dumps(res, ensure_ascii=False))

app01/models.py

  1. # Create your models here.
  2. from django.db import models
  3.  
  4. # Create your models here.
  5.  
  6. class User(models.Model):
  7. name=models.CharField(max_length=32)
  8. pwd=models.CharField(max_length=32)
  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. def __str__(self):
  26. return self.title
  27.  
  28. class Publish(models.Model):
  29. name=models.CharField(max_length=32)
  30. email=models.EmailField()
  31. def __str__(self):
  32. return self.name
  33.  
  34. class Author(models.Model):
  35. name=models.CharField(max_length=32)
  36. age=models.IntegerField()
  37. def __str__(self):
  38. return self.name

app01/utils.py

  1. from rest_framework import exceptions
  2.  
  3. from rest_framework.authentication import BaseAuthentication
  4.  
  5. from .models import *
  6.  
  7. # 用于认证的类
  8. class TokenAuth(BaseAuthentication):
  9. def authenticate(self,request):
  10.  
  11. token = request.GET.get("token")
  12. token_obj = Token.objects.filter(token=token).first()
  13. if not token_obj:
  14. raise exceptions.AuthenticationFailed("验证失败!")
  15. else:
  16. return token_obj.user.name,token_obj.token
  17.  
  18. # 用于增加权限的类
  19. class SVIPPermission(object):
  20. message = "只有超级用户才能访问"
  21.  
  22. def has_permission(self,request,view):
  23. username=request.user
  24. user_type=User.objects.filter(name=username).first().user_type
  25.  
  26. if user_type==3:
  27.  
  28. return True # 通过权限认证
  29. else:
  30. return False

app01/serilizer.py

  1. from rest_framework import serializers
  2.  
  3. from app01.models import *
    """
    用于序例化的一个模块
    """
  4. # 为queryset,model对象做序列化
  5. class PublishSerializers(serializers.Serializer):
  6. name = serializers.CharField()
  7. email = serializers.CharField()
  8.  
  9. # 类似于ModelForm
  10. # 这个也是做转换的
  11. class PublishModelSerializers(serializers.ModelSerializer):
  12. class Meta:
  13. model=Publish
  14. fields="__all__"
  15.  
  16. # class BookSerializers(serializers.Serializer):
  17. # title = serializers.CharField(max_length=32)
  18. # price = serializers.IntegerField()
  19. # pub_date = serializers.DateField()
  20. # 一对多
  21. # publish=serializers.CharField(source="publish.name")
  22. # 多对多
  23. # #authors=serializers.CharField(source="authors.all")
  24. # authors = serializers.SerializerMethodField()
  25. # 类似于钩子
  26. # def get_authors(self,obj):
  27. # temp=[]
  28. # for obj in obj.authors.all():
  29. # temp.append(obj.name)
  30. # return temp
  31.  
  32. '''
  33. 序列化BookSerializers(book_list,many=True)过程:
  34. temp=[]
  35. for obj in book_list:
  36. temp.append({
  37. "title":obj.title,
  38. "price":obj.price,
  39. "pub_date":obj.pub_date,
  40. "publish":str(obj.publish), # obj.publish.name
  41. #"authors":obj.authors.all,
  42. "authors": get_authors(obj)
  43. })
  44.  
  45. '''
  46.  
  47. class BookModelSerializers(serializers.ModelSerializer):
  48. class Meta:
  49. model = Book
  50. fields = "__all__"
  51.  
  52. #publish=serializers.CharField(source="publish.pk")
  53. publish=serializers.HyperlinkedIdentityField(
  54. view_name="detailpublish",
  55. lookup_field="publish_id",
  56. lookup_url_kwarg="pk"
  57. )
  58.  
  59. # authors=serializers.CharField(source="authors.all")
  60. # authors = serializers.SerializerMethodField()
  61. # def get_authors(self,obj):
  62. # temp=[]
  63. # for obj in obj.authors.all():
  64. # temp.append(obj.name)
  65. # return temp
  66.  
  67. # def create(self, validated_data):
  68. # print("validated_data",validated_data)
  69. # book=Book.objects.create(title=validated_data["title"],price=validated_data["price"],pub_date=validated_data["pub_date"],publish_id=validated_data["publish"]["pk"])
  70. # book.authors.add(*validated_data["authors"])
  71. #
  72. # return book
  73.  
  74. class AuthorModelSerializers(serializers.ModelSerializer):
  75. class Meta:
  76. model = Author
  77. fields = "__all__"

settings.py

  1. """
  2. Django settings for restdemo project.
  3.  
  4. Generated by 'django-admin startproject' using Django 1.11.1.
  5.  
  6. For more information on this file, see
  7. https://docs.djangoproject.com/en/1.11/topics/settings/
  8.  
  9. For the full list of settings and their values, see
  10. https://docs.djangoproject.com/en/1.11/ref/settings/
  11. """
  12.  
  13. import os
  14.  
  15. # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
  16. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  17.  
  18. # Quick-start development settings - unsuitable for production
  19. # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
  20.  
  21. # SECURITY WARNING: keep the secret key used in production secret!
  22. SECRET_KEY = 'zh7zb+r@$sgy(e=2p%dh7229g2z*diug%7ifpg$53a8=_gvi=d'
  23.  
  24. # SECURITY WARNING: don't run with debug turned on in production!
  25. DEBUG = True
  26.  
  27. ALLOWED_HOSTS = []
  28.  
  29. # Application definition
  30.  
  31. INSTALLED_APPS = [
  32. 'django.contrib.admin',
  33. 'django.contrib.auth',
  34. 'django.contrib.contenttypes',
  35. 'django.contrib.sessions',
  36. 'django.contrib.messages',
  37. 'django.contrib.staticfiles',
  38. 'app01.apps.App01Config',
  39. "rest_framework",
  40. ]
  41.  
  42. MIDDLEWARE = [
  43. 'django.middleware.security.SecurityMiddleware',
  44. 'django.contrib.sessions.middleware.SessionMiddleware',
  45. 'django.middleware.common.CommonMiddleware',
  46. #'django.middleware.csrf.CsrfViewMiddleware',
  47. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  48. 'django.contrib.messages.middleware.MessageMiddleware',
  49. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  50. ]
  51.  
  52. ROOT_URLCONF = 'restdemo.urls'
  53.  
  54. TEMPLATES = [
  55. {
  56. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  57. 'DIRS': [os.path.join(BASE_DIR, 'templates'),],
  58. 'APP_DIRS': True,
  59. 'OPTIONS': {
  60. 'context_processors': [
  61. 'django.template.context_processors.debug',
  62. 'django.template.context_processors.request',
  63. 'django.contrib.auth.context_processors.auth',
  64. 'django.contrib.messages.context_processors.messages',
  65. ],
  66. },
  67. },
  68. ]
  69.  
  70. WSGI_APPLICATION = 'restdemo.wsgi.application'
  71.  
  72. # Database
  73. # https://docs.djangoproject.com/en/1.11/ref/settings/#databases
  74.  
  75. DATABASES = {
  76. 'default': {
  77. 'ENGINE': 'django.db.backends.sqlite3',
  78. 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  79. }
  80. }
  81.  
  82. # Password validation
  83. # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
  84.  
  85. AUTH_PASSWORD_VALIDATORS = [
  86. {
  87. 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
  88. },
  89. {
  90. 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
  91. },
  92. {
  93. 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
  94. },
  95. {
  96. 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
  97. },
  98. ]
  99.  
  100. # Internationalization
  101. # https://docs.djangoproject.com/en/1.11/topics/i18n/
  102.  
  103. LANGUAGE_CODE = 'en-us'
  104.  
  105. TIME_ZONE = 'UTC'
  106.  
  107. USE_I18N = True
  108.  
  109. USE_L10N = True
  110.  
  111. USE_TZ = True
  112.  
  113. # Static files (CSS, JavaScript, Images)
  114. # https://docs.djangoproject.com/en/1.11/howto/static-files/
  115.  
  116. STATIC_URL = '/static/'
  117.  
  118. # 将自己的认证类变成全局的!
  119. REST_FRAMEWORK = {
  120.  
  121. # "DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.TokenAuth",],
  122. # "DEFAULT_PERMISSION_CLASSES": ["app01.utils.SVIPPermission",],
  123. # "PAGE_SIZE":1
  124. }

笔记!! 重点多看源码多看rest_framework的各个类的源码!!!!

  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

10.30 rest_framework总结的更多相关文章

  1. gnuWin32-mini-2016.10.30

    2016-10-28 04:48 1,017,856 awk.exe ver 4.1.4 2016-10-29 00:26 77,312 bc.exe ver 1.06 2016-10-30 01:4 ...

  2. 背水一战 Windows 10 (30) - 控件(文本类): AutoSuggestBox

    [源码下载] 背水一战 Windows 10 (30) - 控件(文本类): AutoSuggestBox 作者:webabcd 介绍背水一战 Windows 10 之 控件(文本类) AutoSug ...

  3. 2016.10.30 NOIP模拟赛 day2 PM 整理

    满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...

  4. 10.30 正睿停课训练 Day12

    目录 2018.10.30 正睿停课训练 Day12 A 强军战歌(DP 树状数组 容斥) B 当那一天来临(思路) C 假如战争今天爆发(贪心) 考试代码 B C 2018.10.30 正睿停课训练 ...

  5. 第18次Scrum会议(10/30)【欢迎来怼】

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华 小组照片 二.开会信息 时间:2017/10/30 17:19~17:38,总计19min.地点:东北师 ...

  6. 2016.10.30 NOIP模拟赛 day2 AM 整理

    题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...

  7. 10.30 afternoon

    P76竞赛时间: ????年??月??日??:??-??:?? 题目名称 他 她 它 名称 he she it 输入 he.in she.in it.in 输出 he.out she.out it.o ...

  8. [软件工程基础]2017.10.30 第三次 Scrum 会议

    决议 游心与李煦通沟通生成报告脚本问题,并调试相应代码 李煦通部署服务器,并做一定安全检查 石奇川设计实验流程和题库前端页面 王嘉睿爵测试网站基本流程,提出关于用户体验方面的建议 刘子渊阅读代码,为机 ...

  9. sql 从未连续的Id中选择10~30条数据

    select * from(select *,row_number()over(order by ProductID) as num from Products) as t where t.num&g ...

随机推荐

  1. 如何使用HttpClient包实现JAVA发起HTTP请求?

    今天在搭建公司项目框架的时候,发现缺少了一个Java发送HTTP请求的工具类,在网上找了一通,经过自己的改造,已经能实现get请求和post请求的了,现在将代码贴在这里.给大家参考. 1 packag ...

  2. Translate Angular >=4 with ngx-translate and multiple modules

    原文:https://medium.com/@lopesgon/translate-angular-4-with-ngx-translate-and-multiple-modules-7d9f0252 ...

  3. SpringBoot(十):读取application.yml下配置参数信息,java -jar启动时项目修改参数

    读取application.yml下配置参数信息 在application.yml文件内容 my: remote-address: 192.168.1.1 yarn: weburl: http://1 ...

  4. 为ExecutorService增加shutdown hook

    public class ShutdownHook { private static final ShutdownHook INSTANCE = new ShutdownHook(); private ...

  5. web安全测试---AppScan扫描工具

    安全测试应该是测试中非常重要的一部分,但他常常最容易被忽视掉. 尽管国内经常出现各种安全事件,但没有真正的引起人们的注意.不管是开发还是测试都不太关注产品的安全.当然,这也不能怪我们苦B的“民工兄 弟 ...

  6. iostat各字段的来源和真实含义

    The primary tool for inspecting Linux disk performance is iostat. The output includes many important ...

  7. http://www.360doc.com/userhome.aspx?userid=5054188&cid=235

    http://www.360doc.com/userhome.aspx?userid=5054188&cid=235

  8. 小型互联网公司的IT系统建设思路

    ​​最近一些想创业的一帮兄弟来问我,准备借助互联网的翅膀,做某某事情,并想尽快的做出一个系统平台. 我给的思路,分6个步骤: 需求-> 灵感设计 ->实现 ->迭代改进 ->成 ...

  9. vue 实站技巧总结

    多个页面都使用的到方法,放在 vue.prototype上会很方便 刚接触 vue的时候做过一件傻事,因为封装了一个异步请求接口post,放在 post.js文件里面,然后在每个需要使用异步请求的页面 ...

  10. MySQL安装、配置、测试

    MySQL安装.配置.测试(win7_64bit) 目录 1.概述 2.本文用到的工具 3.MySQL安装配置 4.Java访问MySQL测试 5.注事事项 6.相关博文 >>看不清的图片 ...