python项目篇-restframework源码分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27695659/article/details/88145105

1 APIView

class BookView(APIView):pass
 url(r'^books/$', views.BookView.as_view(),name="books"),
 url(r'^books/$', View类下的view,name="books"),
 一旦访问books/:  view(request)======APIView类下的dispatch()====请求方式对应的示例方法()

2 def dispatch():

2.1 初始化操作

2.1.1 构建新的request:

 	    self.request=self.initial_request()
	  # self.request._request
	  # self.request.GET
	  # self.request.data

2.2.2 执行组件

2.2.2.1认证:request.user

self.initial(request, *args, **kwargs)====   # 认证组件
self.perform_authentication(request)==== request.user
		for authenticator in self.authenticators:  # [TokenAuth(),]
			try:
				user_auth_tuple = authenticator.authenticate(self)
				except exceptions.APIException:
				self._not_authenticated()
				raise

				if user_auth_tuple is not None:
				self._authenticator = authenticator
				self.user, self.auth = user_auth_tuple
				return
						

2.2.2.2权限组件

self.check_permissions(request)
						   ===========
								 for permission in self.get_permissions():
										if not permission.has_permission(request, self):
											self.permission_denied(
												request, message=getattr(permission, 'message', None)
											)
						

2.2.2.3频率组件

self.check_throttles(request)
	for throttle in self.get_throttles():  # [VisitRateThrottle(),]
		if not throttle.allow_request(request, self):
			self.throttled(request, throttle.wait()) # 受限制
					   

2.2.2.4分发

 if request.method.lower() in self.http_method_names:
			handler = getattr(self,request.method.lower(),
								  self.http_method_not_allowed)
		
			response = handler(request, *args, **kwargs)
			
			return response

3 序列化组件

class PublishSerializers(serializers.Serializer):
			name = serializers.CharField()
			email = serializers.CharField()
	        		
	class PublishModelSerializers(serializers.ModelSerializer):
			class Meta:
				model=Publish
				fields="__all__"
	
	# queryset或者model对象-------------》json数据
    ps=PublishSerializers(queryset,many=True)
    ps.data # [{},{},{}]
	
	ps=PublishSerializers(model_obj,many=False)
    ps.data # {}
	
	
	# json数据-------》记录
	# 添加操作
	ps=PublishSerializers(data=request.data)
	if ps.is_valid():
	   ps.save()  # create
	   
	# 更新操作
	
	ps=PublishSerializers(model_obj,data=request.data)
	if ps.is_valid():
	   ps.save()  # update

4 视图组件

# 版本1:
	      # Book表
			class BookView(APIView):
				
				def get(self,request):
					book_list=Book.objects.all()
					bs=BookModelSerializers(book_list,many=True,context={'request': request})
					return Response(bs.data)		
				def post(self,request):
					# post请求的数据
					bs=BookModelSerializers(data=request.data)
					if bs.is_valid():
						print(bs.validated_data)
						bs.save()# create方法
						return Response(bs.data)
					else:
						return Response(bs.errors)


			class BookDetailView(APIView):

				def get(self,request,id):

					book=Book.objects.filter(pk=id).first()
					bs=BookModelSerializers(book,context={'request': request})
					return Response(bs.data)

				def put(self,request,id):
					book=Book.objects.filter(pk=id).first()
					bs=BookModelSerializers(book,data=request.data)
					if bs.is_valid():
						bs.save()
						return Response(bs.data)
					else:
						return Response(bs.errors)

				def delete(self,request,id):
					Book.objects.filter(pk=id).delete()

					return Response()
    

    # 版本2:mixIn
	
	    from rest_framework import mixins
		from rest_framework import generics

		class AuthorView(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):
			queryset=Author.objects.all()
			serializer_class =AuthorModelSerializers

			def get(self,request, *args, **kwargs):
				return self.list(request, *args, **kwargs)
			def post(self,request, *args, **kwargs):
				return self.create(request, *args, **kwargs)


		class AuthorDetailView(mixins.RetrieveModelMixin,mixins.DestroyModelMixin,mixins.UpdateModelMixin,generics.GenericAPIView):
			queryset = Author.objects.all()
			serializer_class = AuthorModelSerializers

			def get(self,request,*args, **kwargs):
				return self.retrieve(request,*args, **kwargs)

			def delete(self,request,*args, **kwargs):
				return self.destroy(request,*args, **kwargs)

			def put(self,request,*args, **kwargs):
				return self.retrieve(request,*args, **kwargs)
			
			
	# 版本3:基于通用类
	    from rest_framework import mixins
		from rest_framework import generics


		class AuthorView(generics.ListCreateAPIView):
			queryset=Author.objects.all()
			serializer_class =AuthorModelSerializers

		class AuthorDetailView(generics.RetrieveUpdateDestroyAPIView):
			queryset = Author.objects.all()
			serializer_class = AuthorModelSerializers
	        
	# 版本4
	 class AuthorModelView(viewsets.ModelViewSet):
			queryset = Author.objects.all()
			serializer_class = AuthorModelSerializers
			
	 url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
     url(r'^authors/(?P<pk>\d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put"
流程:
	     url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
	     url(r'^authors/$', ViewSetMixin.as_view({"get":"list","post":"create"}),name="author"),
	     url(r'^authors/$', ViewSetMixin类下的view),
		 一旦访问 /authors/:
     		 ViewSetMixin
			 def  view():
                for method, action in actions.items(): # {"get":"list","post":"create"}
					handler = getattr(self, action)    # self.list  self.create
					setattr(self, method, handler)			
			             
                self.dispatch(request, *args, **kwargs)
            
			APIView类下的self.dispatch
		          # 分发
					if request.method.lower() in self.http_method_names:
						handler = getattr(self,request.method.lower(),
										  self.http_method_not_allowed)
				

					response = handler(request, *args, **kwargs) # self.list()
					
					return response
		

5 认证权限频率 组件

request.META:
        {'ALLUSERSPROFILE': 'C:\\ProgramData', 
		'APPDATA': 'C:\\Users\\Administrator\\AppData\\Roaming', 
		'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 
		'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files',
		'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 
		'COMPUTERNAME': 'PC201712041709',
		'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', 
		'DJANGO_SETTINGS_MODULE': 'restdemo.settings', 
		'FP_NO_HOST_CHECK': 'NO', 'HOMEDRIVE': 'C:', 
		'HOMEPATH': '\\Users\\Administrator',
		'LOCALAPPDATA': 'C:\\Users\\Administrator\\AppData\\Local', 
		'LOGONSERVER': '\\\\PC201712041709', 
		'NUMBER_OF_PROCESSORS': '4', 'OS': 'Windows_NT',
		'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', 
		'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 
		'PROCESSOR_ARCHITECTURE': 'AMD64', 
		'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 60 Stepping 3, GenuineIntel',
		'PROCESSOR_LEVEL': '6', 'PROCESSOR_REVISION': '3c03', 
		'PROGRAMDATA': 'C:\\ProgramData',
		'PROGRAMFILES': 'C:\\Program Files',
		'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 
		'PROGRAMW6432': 'C:\\Program Files', 
		'PSMODULEPATH': 'C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\', 
		'PUBLIC': 'C:\\Users\\Public', 'PYCHARM_HOSTED': '1', 'PYTHONIOENCODING': 'UTF-8', 
		'PYTHONPATH': 'C:\\Users\\Administrator\\PycharmProjects\\s9\\restdemo', 'PYTHONUNBUFFERED': '1', 
		'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\\Windows', 
		'TEMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp', 'TMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp',
		'USERDOMAIN': 'PC201712041709', 
		'USERNAME': 'Administrator', 
		'USERPROFILE': 'C:\\Users\\Administrator', 
		'WINDIR': 'C:\\Windows', 'WINDOWS_TRACING_FLAGS': '3', 
		'WINDOWS_TRACING_LOGFILE': 'C:\\BVTBin\\Tests\\installpackage\\csilogfile.log',
		'RUN_MAIN': 'true', 'SERVER_NAME': 'PC201712041709', 
		'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '8000', 
		'REMOTE_HOST': '', 
		'CONTENT_LENGTH': '', 
		'SCRIPT_NAME': '', 
		'SERVER_PROTOCOL': 'HTTP/1.1', 
		'SERVER_SOFTWARE': 'WSGIServer/0.2', 
		'REQUEST_METHOD': 'GET', 
		'PATH_INFO': '/authors/', 
		'QUERY_STRING': 'token=8204b8e3ac40bf59ae480d17c146b51a', 
		'REMOTE_ADDR': '127.0.0.1', 
		'CONTENT_TYPE': 'text/plain', 
		'HTTP_HOST': '127.0.0.1:8000', 
		'HTTP_CONNECTION': 'keep-alive', 
		'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', 
		'HTTP_UPGRADE_INSECURE_REQUESTS': '1', 
		'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
		'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'>}

6 解析器-----数据解析器

from rest_framework.parsers import JSONParser,FormParser,MultiPartParser,FileUploadParser
parser_classes = [JSONParser,FormParser]

7 路由控制

url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
url(r'^authors/(?P<pk>\d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailauthor"),
class AuthorModelView(viewsets.ModelViewSet):
   
	queryset = Author.objects.all()
	serializer_class = AuthorModelSerializers
				
				
				
url(r'^books/$', views.BookModelView.as_view({"get":"list","post":"create"}),name="author"),
url(r'^books/(?P<pk>\d+)/$', views.BookModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailbook"),
         
		 
	   
class AuthorModelView(viewsets.ModelViewSet):
   
	queryset = Author.objects.all()
	serializer_class = AuthorModelSerializers

猜你喜欢

转载自blog.csdn.net/qq_27695659/article/details/88145105
今日推荐