• Django补充


    Http请求的本质:
      socket之间进行通信

        Django程序:socket服务端

          a.服务端监听IP和端口

          c.接受请求

            请求头之间 分割

            请求体之间 分割

            请求分为POST请求和GET请求:POST请求有请求头和请求体,GET请求只有请求头

          d.服务器响应

            响应头和响应体

          e.断开连接

        浏览器:socket客户端

          b.浏览器发送请求

          e.断开连接

    Cookie:在请求头和响应头中存在

      写浏览器cookie:{session_id: '随机字符串' }

      用户认证成功后,写入用户信息到服务器session:{ '随机字符串' :{key : value,......}}

      每次用户请求都在cookie中携带session_id,服务器根据session_id寻找对应的用户信息

    Django的请求生命周期:

    Django没有socket
      1.wsgiref的socket接受数据
      2.数据通过中间件到达路由系统
      3.路由系统分发到相应的视图函数
      4.视图函数通过ORM到数据库中取得相应的数据,并获得模板将数据进行渲染最后返回中间件,通过wsgi返回给用户
    FBV

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^index.html$', views.index),  #FBV
    ]
    
    def index(request):
        return HttpResponse('OK')  #FBV

    CBV 

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        # url(r'^index.html$', views.index),  #FBV
        url(r'^index.html$', views.IndexView.as_view()), #CBV
        url(r'^login.html$', views.LoginView.as_view()), #CBV  
    ]
    
    class AuthView(View):
        def dispatch(self, request, *args, **kwargs):
            if not request.session['user_login']:
                return redirect('/login.html')
            res=super(AuthView, self).dispatch(request,*args,**kwargs)
            return res
    
    class LoginView(View):
        def get(self,request):
            return (request,"login.html")
        def post(self,request):
            user=request.POST.get('name')
            pwd=request.POST.get('pwd')
            if user == 'xiaobai' and pwd == 'youzi':
                request.session['user_login']='xiaobai'
                return redirect('/index.html')
            return render(request,"login.html")
    
    class IndexView(AuthView):
        def get(self,request,*args,**kwargs):
            return render(request,'index.html')
        def post(self,request,*args,**kwargs):
            return HttpResponse('youzi')
    

    CBV的装饰器

    1.加在get和post方法上

    def test(func):
        def inner(*args,**kwargs):
            return func(*args,**kwargs)
        return inner
    
    class LoginView(View):
    							
    	def dispatch(self, request, *args, **kwargs):
    		return super(LoginView,self).dispatch(request, *args, **kwargs)
    		
    	@method_decorator(test)
    	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')

    2.加在dispatch上

    class LoginView(View):
    	@method_decorator(test)
    	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')
    

    3.加在类上

    @method_decorator(test,name='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')
    

    4.特殊csrf,只能加在dispatch上

    全局django.middleware.csrf.CsrfViewMiddleware;下面代码为局部伪造跨站请求

    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    class LoginView(View):
    	@method_decorator(csrf_exempt)
    	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')

    中间件

    from django.shortcuts import HttpResponse,redirect
    class MiddlewareMixin(object):
        def __init__(self, get_response=None):
            self.get_response = get_response
            super(MiddlewareMixin, self).__init__()
    
        def __call__(self, request):
            response = None
            if hasattr(self, 'process_request'):
                response = self.process_request(request)
            if not response:
                response = self.get_response(request)
            if hasattr(self, 'process_response'):
                response = self.process_response(request, response)
            return response
    
    
    class M1(MiddlewareMixin):
    
        def process_request(self,request):
            print('m1.process_request')
    
        def process_view(self,request, view_func, view_func_args, view_func_kwargs):
            print('m1.process_view')
    
        def process_exception(self,request,exception):
            print('m1.process_exception')
    
        def process_response(self,request,response):
            print('m1.process_response')
            return response
    
        def process_template_response(self,request,response):
            print('m1.process_template_response')
            return response
    
    class M2(MiddlewareMixin):
        def process_request(self, request):
            print('m2.process_request')
    
        def process_view(self, request, view_func, view_func_args, view_func_kwargs):
            print('M2.process_view')
    
        def process_exception(self,request,exception):
            print('m2.process_exception')
            return HttpResponse('开发的程序员已经被打死')
        def process_response(self, request, response):
            print('m2.process_response')
            return response
    
        def process_template_response(self,request,response):
            print('m2.process_template_response')
            return response

     process_request和process_response

      请求信息从上而下执行各个中间件的process_request,进行路由匹配执行相应的视图函数,返回值通过中间件自下而上执行process_response;如果编写的process_request有return 返回值时,会执行平行的process_response返回给用户

    process_view

     

      中间价中存在process_view时:
        中间价从上而下执行process_request,全部执行完成之后会进行路由匹配,从上而下执行中间件的process_view最后执行匹配到的视图函数,返回中间件执行process_response;如果process_view有return返回值时,不会执行匹配到的视图函数,而是从下而上执行中间件的process_response

     process_exception

     

      process_exception 默认不执行,在视图函数出错时执行,有return返回值;请求发来后,中间件从上而下执行process_request,进行路由匹配,继续按照从上而下的顺序执行process_view,出错后从下而上执行捕获到的process_exception然后按照从下而下执行process_response
    process_template_response

    process_template_response 默认不执行,返回的对象如果有render方法时会运行,有返回值
    return response


      

  • 相关阅读:
    在ts+vue中实现前端批量下载打包二维码
    常用到的MD5加密
    Permission denied Command PhaseScriptExecution failed with a nonzero exit code
    iOS App 内购 Demo
    App 上架遇到的坑
    基于StreamingKit的音频播放器
    iOS 添加多图片加签名
    xcode10 自定义代码块
    xcode10 之后代码不联想
    Mac 开发PHP 使用ThinkPHP
  • 原文地址:https://www.cnblogs.com/c491873412/p/7562030.html
Copyright © 2020-2023  润新知