zoukankan      html  css  js  c++  java
  • 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')),
        ]
  • 相关阅读:
    Read-Copy Update Implementation For Non-Cache-Coherent Systems
    10 华电内部文档搜索系统 search04
    10 华电内部文档搜索系统 search05
    lucene4
    10 华电内部文档搜索系统 search01
    01 lucene基础 北风网项目培训 Lucene实践课程 索引
    01 lucene基础 北风网项目培训 Lucene实践课程 系统架构
    01 lucene基础 北风网项目培训 Lucene实践课程 Lucene概述
    第五章 大数据平台与技术 第13讲 NoSQL数据库
    第五章 大数据平台与技术 第12讲 大数据处理平台Spark
  • 原文地址:https://www.cnblogs.com/pythonz/p/10311641.html
Copyright © 2011-2022 走看看