关于母版自定义的问题

模板引擎:

基本实用{{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 母版 中间件的更多相关文章

  1. day73 中间件 以及模板引擎

    模板引擎: 基本实用{{k1}}  if for 模板中自定义函数:操作步骤 1在已经注册的App中创建一个名字叫templates文件夹 2任意创建一个py文件, 3创建名字叫register 的L ...

  2. 中间件详解,Django复习

    day74 2018-05-21 课程安排周一: 中间件 auth模块+分析BBS项目需求(小组讨论把表结构设计出来) 1. 今日内容 中间件:http://www.cnblogs.com/liwen ...

  3. 9.25中间件和Django的学过的知识总结

    2018-9-25 12:10:54 参考连接:http://www.cnblogs.com/liwenzhou/p/8761803.html 浏览器访问Django的过程 面试时容易问到   Dja ...

  4. django (装饰器,母版继承,自定义,request对象,response对象)

     1. 装饰器  1.    def wrapper(fn):    def inner(*args,**kwargs):     执行被装饰函数之前的操作     ret = fn(*args,** ...

  5. Django:母版、继承、组件、自定义标签

    1.for循环应用 1.1for Variable Description forloop.counter 当前循环的索引值(从1开始) forloop.counter0 当前循环的索引值(从0开始) ...

  6. 模板、中间件以及MVC与MTV

    模板 基本数据类型的渲染 {#基础数据类型的渲染#} {#1. 变量#} {{ name }} {#2. 列表#} {#通过点索引可以取值#} {{ list.0 }} {#for循环取值#} {% ...

  7. django模块导入/函数/中间件/MVC和MTV/CSRF

    目录 一:模块导入 二:函数 三:中间件 四:MVC和MTV 五:csrf 一:模块导入 第一种:继承 这里的母版更像是一个架子,子板都是定义的内容(如果多个页面中 ,存在相同的页面:这样我们可以抽到 ...

  8. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  9. ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”

    DeveloperExceptionPageMiddleware中间件利用呈现出来的错误页面实现抛出异常和当前请求的详细信息以辅助开发人员更好地进行纠错诊断工作,而ExceptionHandlerMi ...

随机推荐

  1. Scrapy - CrawlSpider爬虫

    crawlSpider 爬虫 思路: 从response中提取满足某个条件的url地址,发送给引擎,同时能够指定callback函数. 1. 创建项目 scrapy startproject mysp ...

  2. shiro中记住我功能

    Shiro提供了记住我(RememberMe)的功能,比如访问如淘宝等一些网站时,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问,基本流程如下: 1.首先在登录页面选中Reme ...

  3. h5手机端禁止缩放问题

    最近测试html5页面,发现默认都允许用户缩放页面,或者在屏幕双击放大或缩小.即相当于这样设置 <meta name="viewport" content="wid ...

  4. h5网页跳转到app,若未安装app,则跳转app下载页面

    if(isAndroid){ android(); function android(){ var ifr = document.createElement("iframe"); ...

  5. udp用户数据报协议

    UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层 ...

  6. 【LeetCode】区间合并

    给定一组区间,将所有区间重叠的部分合并起来. e.g. 给出 { [1, 3], [2, 6], [8, 10], [15, 18] },返回 { [1, 6], [8, 10], [15, 18] ...

  7. 码云git使用二(从码云git服务器上下载到本地)

    假如我们现在已经把项目添加到码云git服务器了. 我们现在需要通过studio工具把码云git服务器上的某个项目下载到本,并且运行. 1.打开码云网页,找到对应项目的git路径. 2.打开studio ...

  8. WeRun is mini-app

    WeRun is a mini-app within WeChat that allows users to monitor their daily step count. One of its mo ...

  9. ES6中的Promise.resolve()的作用

    var foo = { then: (resolve, reject) => resolve('foo') }; var resolved = Promise.resolve(foo); 相当于 ...

  10. Win10系列:VC++ Direct3D开发基础1

    在介绍如何使用Direct3D项目模版来绘制立体图形之前,首先为读者介绍在Direct3D应用程序开发过程中涉及到的一些常用概念. (1)资源 资源是指可以被Direct3D图形管线所访问的内存空间, ...