Python学习(三十七)—— 模板语言之自定义filter和中间件
一、模板语言之自定义filter
自定义filter文件存放位置
模板中自定义函数 - 在已注册的app中创建一个名字叫 templatetags 文件夹 - 任意创建一个py文件 - 创建名字交 register 的Library类的对象 - 定义函数 from django.template import Library register = Library() # 调用示例:{{ "a1"|meikai:"n1,n2"}} # 参数最多2 # 可以做if的条件 @register.filter def meikai(a1,a2): n1,n2 = a2.split(',') data = "我的名字叫:%s,我喜欢%s和%s" %(a1,n1,n2) return data # 调用示例:{% wangyan 1 2 3 4 %} # 参数无限制 # 无法做if条件 @register.simple_tag def wangyan(a1,a2,a3,a4): result = a1+a2+a3+a4 return result
注意事项
py文件必须写上: from django.template import Library register = Library() 自定义函数的两种方式: @register.filter 缺点:最多只能传两个参数,在模板使用方法{{ 参数1|函数名:参数2 }} 优点:可以在if判断中使用 @register.simple_tag 优点:可以传递多个参数,在模板使用方法{% 函数名 参数1 参数2 参数3 ... %} 在模板中想要使用自定义函数,必须先导入py文件,在模板的开头加上一句: {% load py文件名(不用.py后缀) %}
代码示例:
from django.template import Library register = Library() @register.filter def t1(arg): return arg.upper() @register.simple_tag def melody(n1, n2, n3): str = "I'am {},I like {},my dream is to be a {}".format(n1, n2, n3) return str
二、中间件
概念: 中间件是一个类 定义: 以后想要对所有的请求做统一操作时,用中间件。(几个例外) 只是对少量的视图函数做操作时,用装饰器。 任务: 1. 对用户请求记录日志 2. 用户登录验证(只有login) 梳理: 1. 类 - 继承MiddlewareMixin - 两个方法 process_request process_response,必须设置返回值 2. 应用中间件 MIDDLEWARE = [ ... 'xxxx.md.M1', ] 3. 示例: 1. 对用户请求记录日志 2. 用户登录验证 (只有login) 3. 权限验证 PS: 图+方法+参数
Django的生命周期
浏览器发送请求,经过wsgi,对请求数据进行解析,并封装成request, 然后经过中间件,执行中间件的process_request方法: 1.如果没有返回值或者返回值为None,则到路由系统,然后到视图系统,执行视图函数,通过ORM调用数据库,通过template调用模板语言,并把response返回 2.如果有返回值,则不经过路由系统和视图系统,直接执行中间件的process_response方法,然后经过wsgi进行数据封装,最后返回给浏览器进行渲染
自定义中间件—登陆验证
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse,redirect class AuthMiddleware(MiddlewareMixin): def process_request(self,request): # 如果么有返回值;返回None,表示可以继续往下执行 # 如果有返回值,执行自己的response以及以上的response。 if request.path_info == '/login/': return None user_info = request.session.get('user_info') if not user_info: # return HttpResponse('请登录') return redirect('/login/') def process_response(self,request,response): return response