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 ...
随机推荐
- 【洛谷p2430】严酷的训练
(这个题有一个很神奇的地方) 严酷的训练[传送门] 算法标签(显然01背包了最近一直在练) (他居然没写……) 这个题啊,试了好几遍没a 最后发现在第二层循环的时候应该是j>=rqyt[p[i] ...
- 11204RAC-dbca建库脚本
SET VERIFY OFFconnect "SYS"/"&&sysPassword" as SYSDBAset echo onspool /u ...
- rac 关库 启库
关库顺序 先关闭数据库 然后关闭节点资源 [root@rac1 ~]# srvctl stop database -d prod[root@rac1 ~]# srvctl stop inst ...
- AWR报告学习示例
1. 参数1 AAS AAS讲解 elapsed 为 该AWR性能报告的时间跨度 DB_TIME =所有前台session花费在database调用上的总和时间. 注意:前台进程 foregrou ...
- NPM 使用及npm升级中问题解决
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并 ...
- 2017-4-20/Redis的数据结构及应用场景
1. 谈谈你对redis的理解,它的应用场景. Redis是一个key-value存储系统,它支持存储的value类型包括string字符串.list链表.set集合.sorted Set有序集合和h ...
- zzw原创_Red Hat Enterprise Linux Server release 6.5 安装mysql5.5.28版本
1.查看系统版本 [root@ip12189 ~]# more /etc/issueRed Hat Enterprise Linux Server release 6.5 (Santiago)Ker ...
- redis的文件事件
redis的文件事件:即与io相关的事件. /* File event structure */ typedef struct aeFileEvent { int mask; /* one of AE ...
- 设计模式:java及spring观察者模式(有利于代码解耦)
http://www.cnblogs.com/softidea/p/5716870.html 什么是ApplicationContext? 它是Spring的核心,Context我们通常解释为上下文环 ...
- Linux下使用timedatectl命令时间时区操作详解
timedatectl命令对于RHEL / CentOS 7和基于Fedora 21+的分布式系统来说,是一个新工具,它作为systemd系统和服务管理器的一部分,代替旧的传统的用在基于Linux分布 ...