day73 母版 中间件
关于母版自定义的问题
模板引擎:
基本实用{{k1}} if for 在页面传参数 并判断 通过母版进行交互
一 模板中自定义函数:操作步骤
1在已经注册的App中创建一个名字叫templates文件夹,settings 配置的第一个参数
2任意创建一个py文件, settings 配置的第二个参数 第三个参数就是类的名字
3创建名字叫register(登记的意思) 的Library类的对象
4定义函数 # 我们定义函数的时候函数的参数必须要自己写,指定的,不能是*args,**kwargs.否则会报错
from django.template import Library # 这一行是固定格式
register=Library() # 括号必须要加上 这一行是固定格式
第一种 filter 在我们的模板里面填充数据,
使用固定语法{{'字符串函数的第一个参数'|函数名:'函数的第二个参数(要是多个参数就把后几个视为一个参数)'}}
参数最多是2个
支持使用if做判断
@register.filter # 我们的函数上面是必须要加上这个装饰器,内置的装饰器,否则会报错
def meikai(a1,a2): # 这里的a2可以是一个字符串里面有特殊符号连接,我们使用字符串里面的语法进行分割就得到了多个出来例如 {{'alex'|func'lily;jack'}}
def func(a1,a2):
n1,n2=a2.split(';') # 可以是任意符号去连接那么就使用该符号去分割
使用:
{% load xl %} 这个一定放在页面的最顶端 切注意语法 %的位置
# 在我们的模板也就是HTML文件里面引入我们自定义的那个函数所在的文件名,我们引入之后通过模板语言就可以使用这个函数传参然后拿到返回值把返回值渲染给页面提交浏览器
我们的xl文件这样写:
from django.template import Library
register=Library()
@register.filter
def func(a,b):
print(a,b)
data='%s name is %s' % (a,b) # 这里写成了动态的为了下面得到动态的返回值
return data # 这里的返回值就是动态的
在浏览器页面我们这样写:
<h2>{{'peter'|func'fred'}}<h2> #其他的是正常的HTML页面的标配,就是我们的body里面写一行这样的代码,可以用其他的标签包起来,这个看现实效果即可
第二种
# 调用示例:{% wangyan 1 2 3 4 %}
# 参数无限制
# 无法做if条件
@register.simple_tag
def wangyan(a1,a2,a3,a4):
result = a1+a2+a3+a4
return result
----------------
from django.template import Library
register = Library() #实例化
@register.filter #装饰器 登记
# def func1(a1):
# data = '我的名字叫:%s' % (a1,)
# return data
# def func1(a1,a2):
# data = '我的名字叫:%s,喜欢%s' % (a1,a2)
# return data
# def func1(a1,a2):
# n1,n2 = a2.split(',') #n1,n2 作为一个参数
# data = '我的名字叫:%s,喜欢%s也喜欢%s' % (a1,n1,n2)
# return data
@register.simple_tag
def fun2(a1, a2, a3):
result = a1+a2+a3
return result
@register.filter
def wang(a):
if 'ang'in a:
return True
return False
模板继承的实例
{#注意写法%和括号紧挨着#}
{% load muban %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> {#在html 中依照模板的参数进行传参#}
<h1>{{ k1 }}</h1>
<h1>{{ k1|upper }}</h1>
{#<h1>{{ wangyan|func1 }}</h1> #111#}
{#<h1>{{ wangyan|func1:'luodan' }}</h1>#}
{#<h1>{{ '参数1'|模板定义函数:'参数2' }}</h1>#}
{#一个参数的情况#}
{#<h1>{{ 'wangyan'|func1 }}</h1> #}
{#两个参数的情况#}
{#<h1>{{ 'wangyan'|func1:'luodan'}}</h1>#}
{#我的名字叫:wangyan,喜欢luodan#}
{#三个参数以上必须后几个参数作为一个参数#}
{#<h1>{{ 'wangyan'|func1:'luodan,mutian'}}</h1>#}
{#我的名字叫:wangyan,喜欢luodan也喜欢mutian#} {#简单的simple_tag传参#}
<h2>{% fun2 1 2 3 %}</h2> {% if 'ljkjdlfjawang'|wang %} <h1>帅哥</h1>
{% else %}
<h1>丑货</h1>
{% endif %}
母版的新建文件夹 里面新建py 进行操作
rom django.shortcuts import render
from app01 import models # Create your views here. def login(request):
if request.method == 'POST':
pass
else:
user = request.GET.get('user')
pwd = request.GET.get('pwd')
obj = models.UserInfo.objects.filter(user=user, pwd=pwd).first()
if obj:
# 用户名密码正确
request.session['id']=obj.id
request.session['name']=obj.name else:
# 用户名密码错误
pass
def home(request):
user_id = request.session.get('id') def temp(request):
data_list = {
"k1": 'slkfjsl'
} return render(request,'temp.html',data_list) INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 'app01', # 注册app, Django 1.7/1.8
'app01.apps.App01Config', # 注册app,1.10, 定制启动文件
]
----------------------------------------------------------------
关于中间件
定义:以后想要对所有的请求做统一的操作时候,用中间件
只是对少量的视图函数做操作时 用装饰器
1实现对用户的请求记录日志
2 用户登录验证
#中间件就是为了解决多个函数装饰器的繁琐 函数太多装饰器就不方便了 所以就引用中间件了
一视图函数里面
def login(request):
request.session['user_info']={'id':1,'name':'alex'}
# print('试图函数')
# return HttpResponse('首页') # user_info = request.session.get('user_info')
# if not user_info:
# return redirect('login')
# return HttpResponse('') def index(request):
user_info = request.session.get('user_info')
if not user_info:
return redirect('login')
return HttpResponse('') def classlist(request):
user_info = request.session.get('user_info')
if not user_info:
return redirect('login')
return HttpResponse('') def teacherlist(request):
user_info = request.session.get('user_info')
if not user_info:
return redirect('login')
return HttpResponse('')
----------
中间件简单的练习 中间件就有两种 middlewarecsrtoken
process_request(self,request) 如果有返回值 就直接通过中间件返回客户端
process_response(self,request,response) 三个 返回的是最后一个值
1建立中间件的文件夹 比较随意 哪里都行
------------
2 settings 中 的配置
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# 'appm1.middjian.auth.AuthMiddleware',
'appm1.middjian.auth.M1',
# 'appm1.middjian.auth.M2',
# 中间件的配置 文件夹名+ .py文件+.py文件的类名
-----------
3中间件的py文件的内容
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect,render
class M1(MiddlewareMixin): #这里1.7 1.8 只需要继承object
def process_request(self, request):
print('开始')
def process_response(self,request,response):
print('结束')
return response #这里必须有返回 response
---------
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
#中间件就是为了解决多个函数装饰器的繁琐 函数太多装饰器就不方便了 所以就引用中间件了 只有login 不用中
间件
def login(request):
print('登录界面')
return HttpResponse('11')
def index(request):
print('index页面')
return HttpResponse('22')
def classlist(request):
print('班级页面')
return HttpResponse('33')
def teacherlist(request):
print('老师页面')
return HttpResponse('44')
------------------------------
login的简单实例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="post" method="post">
{% csrf_token %}
<input type="text">
<input type="submit" value="提交">
</form>
</body>
</html>
-----------
结果 要是输入 http://127.0.0.1:8000/login/ 会打印出结果 开始 登录界面 结束
同理 输入 index 后 会打印出结果 开始 index界面 结束
进阶版登录校验
--------------------
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect,render
class AuthMiddleware(MiddlewareMixin):
def process_request(self,request):
if request.path_info == '/login/': #path_info #给login增加一个白名单 返回了
return None
user_info = request.session.get('user_info') #取得session
if not user_info:
return redirect('/login/')
def process_response(self,request, response):
return response
-----------------------
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
#中间件就是为了解决多个函数装饰器的繁琐 函数太多装饰器就不方便了 所以就引用中间件了 只有login 不用中间件
def login(request):
if request.method == 'GET':
return render(request,'login.html')
else:
request.session['user_info']= {'id':1, 'name': 'alex'}
return redirect('/index/')
def index(request):
# user_info = request.session.get('user_info')
# if not user_info:
# return redirect('login')
# return HttpResponse('')
print('index页面')
return HttpResponse('22')
def classlist(request):
# user_info = request.session.get('user_info')
# if not user_info:
# return redirect('login')
# return HttpResponse('')
print('班级页面')
return HttpResponse('33')
def teacherlist(request):
# user_info = request.session.get('user_info')
# if not user_info:
# return redirect('login')
# return HttpResponse('')
print('老师页面')
return HttpResponse('44')
-------------------
day73 母版 中间件的更多相关文章
- day73 中间件 以及模板引擎
模板引擎: 基本实用{{k1}} if for 模板中自定义函数:操作步骤 1在已经注册的App中创建一个名字叫templates文件夹 2任意创建一个py文件, 3创建名字叫register 的L ...
- 中间件详解,Django复习
day74 2018-05-21 课程安排周一: 中间件 auth模块+分析BBS项目需求(小组讨论把表结构设计出来) 1. 今日内容 中间件:http://www.cnblogs.com/liwen ...
- 9.25中间件和Django的学过的知识总结
2018-9-25 12:10:54 参考连接:http://www.cnblogs.com/liwenzhou/p/8761803.html 浏览器访问Django的过程 面试时容易问到 Dja ...
- django (装饰器,母版继承,自定义,request对象,response对象)
1. 装饰器 1. def wrapper(fn): def inner(*args,**kwargs): 执行被装饰函数之前的操作 ret = fn(*args,** ...
- Django:母版、继承、组件、自定义标签
1.for循环应用 1.1for Variable Description forloop.counter 当前循环的索引值(从1开始) forloop.counter0 当前循环的索引值(从0开始) ...
- 模板、中间件以及MVC与MTV
模板 基本数据类型的渲染 {#基础数据类型的渲染#} {#1. 变量#} {{ name }} {#2. 列表#} {#通过点索引可以取值#} {{ list.0 }} {#for循环取值#} {% ...
- django模块导入/函数/中间件/MVC和MTV/CSRF
目录 一:模块导入 二:函数 三:中间件 四:MVC和MTV 五:csrf 一:模块导入 第一种:继承 这里的母版更像是一个架子,子板都是定义的内容(如果多个页面中 ,存在相同的页面:这样我们可以抽到 ...
- ASP.NET Core 中的那些认证中间件及一些重要知识点
前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...
- ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”
DeveloperExceptionPageMiddleware中间件利用呈现出来的错误页面实现抛出异常和当前请求的详细信息以辅助开发人员更好地进行纠错诊断工作,而ExceptionHandlerMi ...
随机推荐
- caffe-ssd
1.安装依赖 1 sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-ser ...
- 23. Merge K Sorted Lists (Java, 归并排序的思路)
题目:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity ...
- 串的模式匹配算法 ------ KMP算法
//KMP串的模式匹配算法 #include <stdio.h> #include <stdlib.h> #include <string.h> int* get_ ...
- js 遍历
for循环 var a = new Array("first", "second", "third") for(var i = 0;i &l ...
- sharding-jdbc读写分离原理解读
原帖地址:https://blog.csdn.net/yanyan19880509/article/details/78170233 前言 很多时候,为了应付DB的高并发读写,我们会采用读写分离技术. ...
- awr相关
手工生成awr快照SQL> exec dbms_workload_repository.create_snapshot; PL/SQL procedure successfully comple ...
- Jaxb 完全手册
Jaxb是JavaEE的规范.全称Java Architecture for XML Binding. 可以根据XML Schema产生Java类的技术.JAXB也提供了将XML实例文档反向生成Jav ...
- Rest Client插件简单介绍
一.这插件是做什么的? 快速测试服务的. 和mockmvc功能差不多,可视化操作更直观一点. 如果使用mockmvc漏掉了一个返回值的验证,可能还需要修改再次启动 使用插件的优点是 1.如果服务端没问 ...
- ntpd修改版本号教程
1.查看当前ntpd版本号 执行:ntpd -v 2.查看当前ntpd位置 执行:which ntpd 3.备份ntpd 执行:cp /usr/sbin/ntpd /usr/sbin/ntpd.bak ...
- Linux安装/卸载软件教程
一.源码安装 ./configure #环境检查.生成makefile make #编译 make install #安装 这三条命令是最经典的Linux软件安装,适用于所有发行版 二.软件包管理工具 ...