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