zoukankan      html  css  js  c++  java
  • Django中的路径分发和视图函数的两种实现方式FBV、CBV

    路径分发

    url(r'^app01/',include('app01.urls')),
    

    视图函数

    views.py
    
    from django.shortcuts import render,Httpresponse,redirect
    
    请求相关的属性方法:
    def index(request): # http相关请求信息-封装-HttpRequest对象
    	print(request.META) # 一个字典,里面一堆数据 请求头相关信息
    	print(request.method)
    	print(request.path) # /index/路径
    	print(request.path_info) # 跟上面一样
    	print(request.get_full_path()) # /index/?username=dazhuang&password=123
    	
    	print(request.body) # b'username=dazhuang' 最原始的bytes数据
    	print(request.GET) # get 请求提交的数据
    	print(request.POST)
    	
      
    响应相关的方法:
    HttpResponse  # ---回复字符串用的方法
    render # 回复一个HTML页面使用
    
    redirect # 重定向
    
    def login(request):
    	if reuqest.method == 'GET':
        return render(request,'login.html')
      else:
        username = request.POST.get('username')
        password = request.POST.get('password')
        if pass:
          # return render(request,'home.html')
          	return redirect('/home/',) # 重定向到另一个页面实现跳转 参数是相对路径
        else:
          return HttpResponse('滚犊子,赶紧去充会员')
       
    def home(request):
       return render(request,'home')
    

    重定向的状态码

    • 301 永久
    • 302 临时

    CBV --- class base view

    • 类实现

      def warrap(f):
        def inner(*args,**kwargs)
        	print('xxxx')
          ret = f(*args,**kwargs)
          return ret
        return inner
      
      
      from django.views import View
      from diango.utils.decorators import method_decorator
      # @method_decorator(n1,name='get') 加装饰器方式三
      class LoginView(View):
        
        @method_decorator(n1)   # 方式2 给所有方法加装饰器
        def dispatch(self,request,*args,**kwargs):
          print('请求来了')
          ret = super().dispatch(request,*args,*kwargs)
      		print('到点了,走人了')
          return ret    
        	
        #@method_decorator(n1)  # 方式1 给当前方法加装饰器
      	def get(self,request):
      		return render(request,'login2.html')
        
        def post(self,request):
          uname = request.POST.get('uname')
          pwd = request.POST.get('pwd')
          if ...:
            return HttpResponse('登入成功')
          else:
          	return HttpResponse('登入失败')
        
        
      url(r'^login2/',views.LoginView.as_view()),
      
      通过不同的请求方法找到对应的视图类中的方法
      dispatch
      

    FBV —function base view

    • 函数实现

      装饰器
      
      def timmer(f):
          #传实参的时候,相当于 f = index   #自由变量 在另一个内存空间
          def inner(*args,**kwargs):
              start_time = time.time()
              r = f(*args,**kwargs)  #f 就是 index本身 执行了 index()
              end_time = time.time()
              print(f'测试本函数的执行效率{end_time-start_time}')
              return r
          return inner
      
      @timmer  #darty = timmer(dariy)
      def dariy(name,age):
          time.sleep(0.5)
          print(f'{name}的年龄是{age}')
          
      
      
  • 相关阅读:
    java的内部编码
    visual studio 快捷键
    C# ref和out总结
    C#函数3递归
    链表操作 两个链表间的相交性问题
    链表操作 有环链表问题
    链表操作 模拟问题
    链表操作 未排序链表的处理问题
    jjQuery 源码分析1: 整体结构
    jQuery 源码分析3: jQuery.fn/ jQuery.prototype
  • 原文地址:https://www.cnblogs.com/he-qing-qing/p/11234581.html
Copyright © 2011-2022 走看看