• day63 Pyhton 框架Django 06


    内容回顾
    
    1.装饰器
    
    装饰器:是一个闭包函数,在不改变原函数的代码和调用方式的基础上,给原函数增加功能。
    
        def wrapper(func):
            def inner(*args,**kwargs):
                # 原函数执行之前
                ret = func(*args,**kwargs)
                # 原函数执行之后
                return ret
            return inner
        
        @wrapper   # func1 = wrapper(func1)
        def func1():
            print('func1')
         
    
    带参数的装饰器:
    
        def outer(flag):
            def wrapper(func):
                def inner(*args,**kwargs):
                    # 原函数执行之前
                    ret = func(*args,**kwargs)
                    # 原函数执行之后
                    return ret
                return inner
               return wrapper
        
        @outer(True)    #  outer(True)   ——》  @wrapper     func1 =wrapper(func1)
        def func1():
            print('func1')
        
    
    多个装饰器装饰同一个函数
    
        def w1(func):
            def inner(*args,**kwargs):
                # 原函数执行之前
                ret = func(*args,**kwargs)
                # 原函数执行之后
                return ret
            return inner
        
        def w2(func):
            def inner(*args,**kwargs):
                # 原函数执行之前
                ret = func(*args,**kwargs)
                # 原函数执行之后
                return ret
            return inner
        
        @w1   #   func1=w1(func1)   w1.inner
        @w2   #   func1 =w2(func1)  w2.inner
        def func1():
            print('func1')
         
        ret = func1()  # 原函数的返回值
    
    
    
    装饰器的修复技术
    
        from functools import wraps
        
        def wrapper(func):
            @wraps(func)
            def inner(*args,**kwargs):
                # 原函数执行之前
                ret = func(*args,**kwargs)
                # 原函数执行之后
                return ret
            return inner
    
    模板中自定义方法
    
    1. 在app下创建一个叫templatetags的python包
    2. 在包内创建python文件 *( my_tags.py)
    3. 在python文件中写固定的内容:
    
        from django import template
        register = template.Library()
    
    1. 写函数 加装饰器
    
        # filter
        @register.filter
        def x1(value,arg='xxx'):
            return True 
        
        # simple_tag
        @register.simple_tag
        def x2(*args,**kwargs):
            return True
                 
        @register.inclusion_tag('li.html')
        def show_li(num):
            return {'num':range(num)}
        
    
    1. inclusion_tag写模板
    
        <ul>
            {% for foo in num %}
                <li> {{ foo }}</li>
            {% endfor %}
        </ul>
    
    使用:
    
    在模板中使用:
    
        {% load my_tags %}
        {{ 'alex'|x1:'very' }}  # True  可以用在if判断中
        
        
        {% x2 'a' k1='v1'  %}
        
        {% show_li 3 %}
        <ul>
            <li> 0</li>
            <li> 1</li>
            <li> 2</li>
        </ul>
        
    
    今日内容
    
    视图
    
    1. FBV CBV
    
    FBV : function based view   
    
    CBV : class based view 
    
    定义:
    
        from django.views import View
        
        class AddPublisher(View):
            
            def get(self,request):
                
                return response
            
            def post(self,request):
                
                return response
    
    使用:
    
        url(r'^add_publisher/', views.AddPublisher.as_view()),
    
    2. CBV的流程:
    
    1. 程序运行的时候AddPublisher.as_view()执行,得到view函数
            url(r'^add_publisher/', view),
    2. 请求到来的时候,执行view函数:
       1. 实例化AddPublisher  ——》 self
       2. self.request =  request 
       3. 执行 self.dispatch(request, *args, **kwargs)
          1. 判断请求方式是否被允许:
             1. 如果允许:通过反射获得相应请求方式的方法 ——》handler
             2. 如果不允许:self.http_method_not_allowed  ——》handler
          2. 执行handler   ——》 返回响应
    
    3. 加装饰器
    
    1. FBV   直接加装饰器即可
    2. CBV
           from django.utils.decorators import method_decorator
           # 1。加载某一个方法上
                   @method_decorator(timer)
                   def get(self, request):
                   
           # 2. 加载dispatch方法上面
                   @method_decorator(timer)
                   def dispatch(self, request, *args, **kwargs):
                   
            # 3. 加在类上
                    @method_decorator(timer, 'post')
                   @method_decorator(timer, 'get')
                     class AddPublisher(View):
    
    4. 是否使用method_decorator的区别
    
    func :     <function AddPublisher.get at 0x00000000042CF158>
    
    args:     (<app01.views.AddPublisher object at 0x000000000440E898>, <WSGIRequest: GET '/add_publisher/'>)
    
    func :     <function method_decorator.<locals>.dec.<locals>.wrapper.<locals>.bound_func at args:     0x00000000045C71E0>
    
    (<WSGIRequest: GET '/add_publisher/'>,)
    
    5. 上传文件
    
    1. form表单指定编码方式enctype="multipart/form-data"
    2. 从request.FILES中 文件对象
    3.     f1.chunks() # 大文件使用 
    
    6. requerst对象
    
        print(request.method)   # 请求方式  GET POST PUT
        print(request.GET)      # URL携带的参数  { ‘name’: ['alex']   }   []  .get('name')
        print(request.POST)     # POST请求提交的数据  { ‘name’: ['alex']   }   .getlist()
        print(request.path_info)  # 路径信息  不包含ip和端口 参数
        print(request.FILES)
        print(request.META)#请求头内容
        print(request.COOKIES)
        print(request.session)
        
        print(request.get_host()) 
        print(request.get_full_path())  # 路径信息  不包含ip和端口  带参数
        print(request.is_ajax())  # 判断是否是ajax请求
    
    7. reponse对象
    
    HttpResponse('字符串 ')       ——》 页面展示 字符串
    
    render(request,'html文件名',  { k1:v1 })    ——》 返回一个完整HTML页面  
    
    redirect(’要跳转的地址‘)  ——》重定向     Location : 地址
    
    JsonResponse:
    
        
        from django.http import JsonResponse
        
        
        def json_data(request):
            data = {'id': 11, 'name': 'alex'}
            l1 = ['alex', 'peiqi']
        
            return JsonResponse(l1, safe=False)  # Content-Type: application/json
    
    路由
    
    分组
    
        url(r'^blog/([0-9]{4})/([0-9]{2})/$', views.blog),
    
    django会把获取到的参数当做位置参数传递给视图函数
    
    命名分组
    
        url(r'^blog/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.blog),
    
    django会把获取到的参数当做关键字参数传递给视图函数
    
    include
    
        from django.conf.urls import url, include
        from django.contrib import admin
        from app01 import views
        
        urlpatterns = [
            url(r'^app01/', include('app01.urls')),
            url(r'^app02/', include('app02.urls')),
        ]
  • 相关阅读:
    优化windows7硬盘操作文件的速度
    Google 开源API汇总
    兼容IE和FF:复制本页地址 收藏本页地址 复制当前页地址和标题
    暂时中断一段时间
    Silverlight C# 游戏开发:绚丽的粒子特效颜色粒子(一)
    任天堂模拟器Silverlight版开发,POPNes Emulator!
    Silverlight C# 游戏开发:资源的处理,图像算法(一)
    Silverlight C# 游戏开发:绚丽的粒子特效粒子效果(二)
    吐血的有道谜题
    Silverlight C# 游戏开发:Flyer09扇动翅膀的蝴蝶
  • 原文地址:https://www.cnblogs.com/pythonz/p/10311641.html
Copyright © 2020-2023  润新知