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')),
    ]

 

posted @ 2019-01-23 21:30  Python张梦书  阅读(175)  评论(0编辑  收藏  举报