zoukankan      html  css  js  c++  java
  • 浅谈Django的生命周期和CBF和FBC

    Django的生命周期和CBF和FBC

    对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端,客户端和服务端通信,字符串(Http协议):请求头和请求体
    响应头+响应体

    而对于Django这个web框架其整个请求的生命周期如上图所示

    需要提别提醒的是大部分人以为Django内部封装了socket,其实不然,Django的socket是没有封装的,而是外部插件。

    路由系统(FBV&CBV)

    一、FBV(function base view)

    在Django的url中我们可以根据一个URL对应一个函数名来定义路由规则如下:

    urlpatterns = [
        url(r'^admin/$', admin.site.urls),
        url(r'^index/$', views.index),
        url(r'^ajaxHandel/$', views.ajaxHandel),
        url(r'^login/$', views.login),
        url(r'^ajaxlogin/$', views.ajaxlogin),
        url(r'^reg/$', views.reg),
        url(r'^set_password/$', views.set_password),
    ]
    

    这里需要注意的是:当客户访问过来请求的时候,到达路由系统后是根据正则来匹配的,如果上面的匹配成功了,后面的路由规则将不会继续匹配,需要注意!!!!所以我们在后面都加一个$来做结尾.

    二、CBV(class base view)

    除可以使用常规的函数去设置Django的视图函数,我们也可以使用类去定义视图如:

    url

    urlpatterns = [
        url(r'^admin/$', admin.site.urls),
        url(r'^index.html$',views.IndexView.as_view()),
    ]
    

    这里需要注意当我们使用class去定义视图时需要在url中继承一个as_view()的类

    views

    对应的视图:

    from django.shortcuts import render,HttpResponse
    from django.views import View   	#class视图需要导入View
     
    class IndexView(View):     	 #继承View
    	
    	def get(self,request,*args,**kwargs):
    		return render(request,'index.html')
    	def post(self,request,*args,**kwargs)
    		return HttpResponse("whatmini")
    

    通过class定义的视图,可以清楚的界定出client端的请求时get请求还是post请求,并执行相应的操作。

    View

    我们会有疑问在执行get和post的函数之前class IndexView(View)这个类发生了什么?

    所以我们需要进入到它继承的View类中去看看如下:

    在View这个类中我们看到有一个dispatch的函数,不难看出我们知道了
    这是一个反射函数的执行,这个反射的列表http_method_allowed
    如下图所示:

    dispatch设置验证

    通过上面的View的源码我们知道了在用类定义视图时首先需要执行的是dispatch函数,所以现在我们可以使用dispatch设置用户登录的关卡:

    from django.shortcuts import render,HttpResponse,redirect
    from django.views import View
    from django.utils.decorators import method_decorator
    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    
    class LoginView(View):
       
        def dispatch(self,request,*args,**kwargs):
            return super(LoginView,self).dispatch(request, *args, **kwargs)
    
        def get(self,request):
            
            return render(request,'login.html')
    
    
        def post(self,request):
            # request.GET
            # request.POST # 请求头中的:content-type
            # request.body
            user = request.POST.get('user')
            pwd = request.POST.get('pwd')
            if user == 'whatmini' and pwd == "4324225":
                # 生成随机字符串
                # 写浏览器cookie: session_id: 随机字符串
                # 写到服务端session:
                # {
                #     "随机字符串": {'user_info':'whatmini}
                # }
                request.session['user_info'] = "whatmini"
                return redirect('/index.html')
            return render(request, 'login.html')
    
    class AuthView(View):
        def dispatch(self, request, *args, **kwargs):
            if not request.session.get('user_info'):   
                return redirect('/login.html')
            res = super(AuthView,self).dispatch(request, *args, **kwargs)    
            return res        #在源码中反射的函数有return值所以这里同样要将res的只return出来
    
    class IndexView(AuthView):
    
        def get(self,request,*args,**kwargs):
            """
            获取数据
            :param request:
            :param args:
            :param kwargs:
            :return:
            """
            return render(request,'index.html')
    
        def post(self,request,*args,**kwargs):
            """
            提交数据
            :param request:
            :param args:
            :param kwargs:
            :return:
            """
            return HttpResponse('999')
    
    class OrderView(AuthView,View):
        def get(self,request,*args,**kwargs):
            """
            获取数据
            :param request:
            :param args:
            :param kwargs:
            :return:
            """
            return render(request,'index.html')
    
        def post(self,request,*args,**kwargs):
            """
            提交数据
            :param request:
            :param args:
            :param kwargs:
            :return:
            """
            return HttpResponse('999')
    

    整个执行的过程如下图所示:

    同时需要提醒的是在form表单提交(只支持两种):GET,POST

    Ajax提交数据(提交方式都支持):['get'获取, 'post'创建, 'put'更新, 'patch'局部更新, 'delete'删除, 'head', 'options', 'trace'] -> restful规范

    装饰器

    Django中使用装饰器必须的继承method_decorator:

    from django.utils.decorators import method_decorator
    

    get,post方法上

    			class LoginView(View):
    				
    				def dispatch(self, request, *args, **kwargs):
    					return super(LoginView,self).dispatch(request, *args, **kwargs)
    
    				def get(self,request):
    					return render(request,'login.html')
    
    				@method_decorator(test)
    				def post(self,request):
    					# request.GET
    					# request.POST # 请求头中的:content-type
    					# request.body
    					user = request.POST.get('user')
    					pwd = request.POST.get('pwd')
    					if user == 'alex' and pwd == "alex3714":
    						# 生成随机字符串
    						# 写浏览器cookie: session_id: 随机字符串
    						# 写到服务端session:
    						# {
    						#     "随机字符串": {'user_info':'alex}
    						# }
    						request.session['user_info'] = "alex"
    						return redirect('/index.html')
    					return render(request, 'login.html')
    

    dispatch方法上

    		class LoginView(View):
    			@method_decorator(test)         #表示给get和post同时装上装饰器
    			def dispatch(self, request, *args, **kwargs):
    				return super(LoginView,self).dispatch(request, *args, **kwargs)
    
    			def get(self,request):
    				return render(request,'login.html')
    
    			
    			def post(self,request):
    				# request.GET
    				# request.POST # 请求头中的:content-type
    				# request.body
    				user = request.POST.get('user')
    				pwd = request.POST.get('pwd')
    				if user == 'alex' and pwd == "alex3714":
    					# 生成随机字符串
    					# 写浏览器cookie: session_id: 随机字符串
    					# 写到服务端session:
    					# {
    					#     "随机字符串": {'user_info':'alex}
    					# }
    					request.session['user_info'] = "alex"
    					return redirect('/index.html')
    				return render(request, 'login.html')
    

    类上

    		@method_decorator(test,name='get')   #加上name=get表示只给get装上装饰器
    		class LoginView(View):
    			
    			def dispatch(self, request, *args, **kwargs):
    				return super(LoginView,self).dispatch(request, *args, **kwargs)
    
    			def get(self,request):
    				return render(request,'login.html')
    
    
    			def post(self,request):
    				# request.GET
    				# request.POST # 请求头中的:content-type
    				# request.body
    				user = request.POST.get('user')
    				pwd = request.POST.get('pwd')
    				if user == 'alex' and pwd == "alex3714":
    					# 生成随机字符串
    					# 写浏览器cookie: session_id: 随机字符串
    					# 写到服务端session:
    					# {
    					#     "随机字符串": {'user_info':'alex}
    					# }
    					request.session['user_info'] = "alex"
    					return redirect('/index.html')
    				return render(request, 'login.html')
    

    特殊:CSRF Token只能加到dispatch

    		from django.views.decorators.csrf import csrf_exempt,csrf_protect
    		class LoginView(View):
    			@method_decorator(csrf_exempt) 	#表示在post请求时不需要cookie验证
    			def dispatch(self, request, *args, **kwargs):
    				return super(LoginView,self).dispatch(request, *args, **kwargs)
    
    			def get(self,request):
    				return render(request,'login.html')
    
    
    			def post(self,request):
    				# request.GET
    				# request.POST # 请求头中的:content-type
    				# request.body
    				user = request.POST.get('user')
    				pwd = request.POST.get('pwd')
    				if user == 'alex' and pwd == "alex3714":
    					# 生成随机字符串
    					# 写浏览器cookie: session_id: 随机字符串
    					# 写到服务端session:
    					# {
    					#     "随机字符串": {'user_info':'alex}
    					# }
    					request.session['user_info'] = "alex"
    					return redirect('/index.html')
    				return render(request, 'login.html')
  • 相关阅读:
    深度学习(二十九)Batch Normalization 学习笔记
    白化(预处理步骤)【转】
    pytorch 优化器调参
    『PyTorch』第十一弹_torch.optim优化器 每层定制参数
    pytorch adam 源码 关于优化函数的调整 optimizer 调参 重点
    PyTorch-Adam优化算法原理,公式,应用
    adam调参
    错误:该行已经属于另一个表
    如何用xmlspy将xml文档生成xsd文件
    端口与安全
  • 原文地址:https://www.cnblogs.com/lijian-22huxiaoshan/p/7563362.html
Copyright © 2011-2022 走看看