重定向与url_for
在app1.py文件中
from flask import Flask, request, redirect,url_for from flask import render_template import json app=Flask(__name__) users=[] @app.route('/',endpoint='index') # endpoint 和url_for 一起用 endpoint给这个路由起一个别名,url_for根据别名获取路由 def index(): return render_template('index.html') @app.route('/register') def register(): r=render_template('register.html') # 默认从模板文件夹中找文件 print(r) return r @app.route('/register2',methods=['GET','POST']) # methods=['GET','POST'] 如果没有这个默认的只有get,没有post def register2(): # 获取页面提交的内容 if request.method=='POST': print(request.full_path) #/register2?username=zhao&address=山西# print(request.path) # /register2 # print(request.args) # dict类型 只能获取get请求的 # print(request.args.get('username')) # 获取值 # print(request.args.get('address')) print(request.form) # 如果请求方法是post 则需要通过request.form取值 print(request.form.get('username')) print(request.form.get('address')) username=request.form.get('username') username2=request.form.get('username2') address=request.form.get('address') if username==username2: user={'username':username,'address':address} users.append(user) return redirect(url_for('index')) # redirect 重定向 else: return '不一样' return '不是post' @app.route('/show') def show(): j_str=json.dumps(users) return j_str @app.route('/test') def test(): url=url_for('index') # 路径反向解析 print(url) return 'test' if __name__=='__main__': print(app.url_map) # 路由规则表 app.run() """ 视图函数的返回值: response响应: 1.str 自动转成response对象 2.dict json 3.response对象 response对象 4.make_response() response对象 5.redirect() 重定向 302状态码 6.render_template() 模板渲染+模板 """ 在index.html文件中
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <a href="/register">注册</a><br> <a href="">登录</a><br> <a href="/show">展示</a><br> </body> </html>
在register.html文件中
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用户注册页面</title> </head> <body> <h1>京东注册页面</h1> <div> {#如果是表单提交则必须在表单的元素上添加name属性#} <form action="register2" method="post"> {#method="get"#} <input type="text" name='username' placeholder="输入用户名"> {#name='xxxx'就是传给register2的内容#} <input type="text" name='address' placeholder="请输入地址"> {#name='xxxx'就是传给register2的内容#} <input type="text" name="username2" placeholder="确认用户名"> <input type="submit" value="提交"> </form> </div> </body> </html>
模板语法
""" 视图函数的返回值: response响应: 1.str 自动转成response对象 2.dict json 3.response对象 response对象 4.make_response() response对象 5.redirect() 重定向 302状态码 6.render_template() 模板渲染+模板 模板:[网页] 模板的语法: 1.在模板中获取view中专送的变量值:{{变量名key}} render_template('模板名字',key=value,key=value) name='小明' # str age=18 # int friends=['1号','2号','3号'] # list dict1={'gift':'大手镯','gift1':'鲜花','gift2':'费列罗'} # dict # 创建对象 girlfriend=Girl('美美','安徽黄山') 自定义的类构建的类型:Girl对象 模板: {{list.0}} 同 {{list[0]}} {{dict.key}} 同 {{dict.get(get)}} {{girl.name}} 同 {{对象.属性}} 2. 控制块: {% if 条件 %} {% endif %} {% if 条件 %} 条件为true {% else %} 条件为False {% endif %} {% for 变量 in 可迭代对象 %} for循环要做的任务 {% endfor %} 可以使用loop变量 loop.index 序号从1开始 loop.index0 序号从0开始 loop.revindex 序号倒着开始最后为1 loop.revindex0 序号倒着开始最后为0 loop.first 布尔类型 是否是第一行 loop.last 布尔类型 是否是第二行 3.过滤器 过滤器本质是函数 模板语法中过滤器: {{变量名|过滤器(*args)}} {{变量名|过滤器}} 常见的过滤器: 1. safe:禁用转译 msg='<h1>520快乐!</h1>' return render_template('show_2.html',girls=girls,users=users,msg=msg) 不想让它转译: {{ msg |safe }} 2.capitalize: 单词的首字母大写 {{ n1|capitalize }} 3.lower 和 upper 大小写的转换 4.title 一句话中的首字母大写 msg='She is a beautiful girl' {{mag|title}} 5.reverse 翻转 {{n1|reverse}} 6.format 格式化 {{ '%s is %d years old'| format('lili',18) }} 7.truncate 字符串截断 list的操作: {{ girls|first }} {{ girls|last }} {{ girls|length }} {#{{ girls|sum }}整形的计算#} {{ [1,3,5,7,8]|sum }} {{ [1,6,5,4,8]|sort }} dict: {% for v in users.0.values() %} 获取值 <p>{{ v }}</p> {% endfor %} <hr> {% for k,v in users.0.items() %} 获取键值 <p>{{ k }}--{{ v }}</p> {% endfor %} <hr> {% for k in users.0.keys() %} 获取键 <p>{{ k }}</p> {% endfor %} """
在app12.py文件中
from flask import Flask,request,render_template app=Flask(__name__) class Girl: def __init__(self,name,addr): self.name=name self.gender='女' self.addr=addr def __str__(self): return self.name @app.route('/show') def show(): name='小明' # str age=18 # int friends=['1号','2号','3号'] # list dict1={'gift':'大手镯','gift1':'鲜花','gift2':'费列罗'} # dict # 创建对象 girlfriend=Girl('美美','安徽黄山') return render_template('show.html',name=name,age=age,friends=friends ,dict1=dict1,girl=girlfriend) if __name__=='__main__': app.run()
在show.html文件中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>展示</title>
</head>
<body>
<div>用户信息展示</div>
<p>
用户名是:{{ name }}--{{ age }}<br>
{{ friends.0 }}<br>
{{ friends[1] }}<br>
{{ friends[:1] }}<br>
{{ dict1.gift1 }}--{{ dict1.get('gift') }} <br>
{{ girl.gender }}--{{ girl.name }}--{{ girl.addr }}
</p>
</body>
</html>
在app13.py文件中
from flask import Flask,request,render_template app=Flask(__name__) app.config.from_object('settings') @app.route('/show1') def show1(): girls=['如花','凤姐','1松松','孙孙','1玲玲','云云'] users=[ {'username':'zhansan1','password':'1231','addr':'北京','phone':'13926575656'}, {'username':'zhansan2','password':'1232','addr':'上海','phone':'13923467576'}, {'username':'zhansan3','password':'1233','addr':'广州','phone':'13923477777'}, {'username':'zhansan4','password':'1234','addr':'深圳','phone':'13923458888'}, {'username':'zhansan5','password':'1235','addr':'杭州','phone':'13923459999'}, ] return render_template('show_1.html',girls=girls,users=users) if __name__=='__main__': app.run()
在show_1.html文件中
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>演示控制块</title> <style> .a{ color:red; font-weight: bold; } </style> </head> <body> {#ul....li#} {#ol....li#} {#{{ girls }}#} <ul> {% for girl in girls %} {#遍历出来,for的应用#} <li>{{ girl }}</li> {% endfor %} </ul> <hr> <ul> {% for girl in girls %} {#for 和 if 的应用#} {% if girl|length>=3 %} {#如果字数大于等于3#} <li class="a">{{ girl }}</li> {#字体变红加粗#} {% else %} {#否则#} <li>{{ girl }}</li> {% endif %} {% endfor %} </ul> <hr> <table border="1" cellspacing="0" cellpadding="0" width="50%"> {% for user in users %} <tr> <td>{{ user.username }}</td> <td>{{ user.password }}</td> <td>{{ user.addr }}</td> <td>{{ user.phone }}</td> </tr> {% endfor %} </table> <hr> <table border="1" cellspacing="0" cellpadding="0" width="50%"> {% for user in users %} {# <tr {% if loop.last %}style="background-color: deeppink" {% endif %}>#} <tr {% if loop.index==1 %}style="background-color: deeppink" {% endif %}> <td>{{ loop.index }}</td> {#序号从1开始#} {# <td>{{ loop.index0 }}</td>#} {#序号从0开始#} {# <td>{{ loop.revindex }}</td> {#序号倒着开始#} <td>{{ user.username }}</td> <td>{{ user.password }}</td> <td>{{ user.addr }}</td> <td>{{ user.phone }}</td> </tr> {% endfor %} </table> </body> </html>
在settings.py文件中
ENV='development' DEBUG=True
在app14.py文件中
from flask import Flask,request,render_template
app=Flask(__name__)
app.config.from_object('settings')
@app.route('/show1')
def show1():
girls=['如花','凤姐','1松松','孙孙','1玲玲','云云']
users=[
{'username':'zhansan1','password':'1231','addr':'北京','phone':'13926575656'},
{'username':'zhansan2','password':'1232','addr':'上海','phone':'13923467576'},
{'username':'zhansan3','password':'1233','addr':'广州','phone':'13923477777'},
{'username':'zhansan4','password':'1234','addr':'深圳','phone':'13923458888'},
{'username':'zhansan5','password':'1235','addr':'杭州','phone':'13923459999'},
]
girls.append('zhangsan')
msg='<h1>520快乐!</h1>'
n1='hello'
return render_template('show_2.html',girls=girls,users=users,msg=msg,n1=n1)
if __name__=='__main__':
app.run()
在show_2.html文件中
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>过滤器的使用</title> </head> <body> 当前用户共:{{ girls |length}}人 <hr> {#过滤器转译#} {{ msg |safe }} <hr> {{ n1|capitalize }} <hr> {{ n1|upper }} <hr> {{n1|reverse}} <hr> {{ '%s is %d years old'| format('lili',18) }} <hr> {{ 'hello world'| truncate(5) | upper }} <hr> {#列表过滤器的使用#} {{ girls|first }}<br> {{ girls|last }}<br> {{ girls|length }}<br> {#{{ girls|sum }}整形的计算#} {{ [1,3,5,7,8]|sum }}<br> {{ [1,6,5,4,8]|sort }}<br> <p> {{ users.0 }}<br> {% for v in users.0.values() %} <p>{{ v }}</p> {% endfor %} <hr> {% for k,v in users.0.items() %} <p>{{ k }}--{{ v }}</p> {% endfor %} <hr> {% for k in users.0.keys() %} <p>{{ k }}</p> {% endfor %} </p> </body> </html>
在settings.py文件中
ENV='development' DEBUG=True
模板
自定义过滤器
过滤器本质是函数 1.通过flask模块中的add_templete_filter方法 a.定义函数,带有参数和返回值 b.添加过滤器 app.add_template_filter(function,name='') c.在模板中使用:{{变量|自定义过滤器}} 2.使用装饰器完成 a.定义函数,带有参数和返回值 b.通过装饰器完成,@app.template_filter('过滤器名字')装饰步骤-的函数 c.在模板中使用:{{变量|自定义过滤器}}
在app15.py文件中
from flask import Flask,render_template import settings app=Flask(__name__) app.config.from_object(settings) @app.route('/') def hello_world(): msg='hello everyone hello world' li=[3,7,9,1,5] return render_template('define_filter.html',msg=msg,li=li) # 过滤器本质是函数 # 第一种方式 def replace_hello(value): print('----',value) value=value.replace('hello','') print('====',value) return value.strip() # 替换的结果返回 app.add_template_filter(replace_hello,'replace') # 第二种方式 装饰器 @app.template_filter('listreverse') def reverse_list(li): temp_li=list(li) temp_li.reverse() return temp_li if __name__=='__main__': app.run()
在define_filter.html文件中
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>自定义过滤器</title> </head> <body> {{ msg }} <hr> {{ msg| replace }} <hr> {{ li }} <hr> {{ li|listreverse }} </body> </html>
复用
模板继承 include 宏 模板继承: 需要模板继承的情况: 1.多个模板具有完全相同的顶部和底部 2.多个模板具有相同的模板内容,但是内容中部分不一样 3.多个模板具有完全相同的模板内容 标签: {% block 名字 %} {% endblock %} 1.定义父模块 2.子模板继承父模板 步骤: 父模板: 1.定义一个base.html的模板 2.分析模板中那些是变化的比如:{% block title %}父模板的title{% endblock %} 对变化的部分用block进行“预留位置”也称作:挖坑 3.注意:样式和脚本 需要提前预留 {% block mycc %}{% endblock %} {% block myjs %}{% endblock %} 子使用父模板: 1.{% extends '父模板的名称'%}将父模板继承过来 2.找到对应的block(坑)填充,每一个block都是有名字的。 include:包含 在A,B,C页面有共同的部分,但是其他页面没有这部分。 这个时候考虑使用include 步骤: 1.先定义一个公共的模板部分,xxx.html 2.谁使用则include过来,{% include '文件夹/xxx.html'%} 宏:macro 1.把它看做是jinja2的一个函数,这个函数可以返回一个HTML字符串 2.目的:代码可以复用,避免代码冗余 定义两种方式: 1.在模板中直接定义: 类似: macro1.html 中定义方式 2.将所有宏提取到一个模板中:macro.html 谁想使用谁导入: {% import 'macro.html' as xxx %} {{ xxx.宏名字(参数)}} 总结: 变量:{{变量}} 块: {% if 条件%}.....{% endif %} {% for 条件%}.....{% endif %} {% block 条件%}.....{% endblock %} {% macro 条件%}.....{% endmacro %} {% include''%} 包含 {% import''%} 导入宏 {% extends''%} {{url_for('static',filename='')}} {{hongname(XXX)}}
模板继承、include、宏
base.html文件和index.html文件是模板继承
header.html文件和index.html文件是include
macro.html文件和macro1.html和macro2.html是宏
app16.py文件是公共部分
在app16.py文件中
from flask import Flask,render_template import settings app=Flask(__name__) app.config.from_object(settings) @app.route('/base') def load_base(): return render_template('base.html') @app.route('/') def index(): return render_template('index.html') @app.route('/welcome') def welcome(): return render_template('welcome.html') @app.route('/macro') def use_macro(): return render_template('macro/macro1.html') @app.route('/macro1') def use_macro1(): return render_template('macro/macro2.html') if __name__=='__main__': app.run()
在macro.html文件中
{#定义宏#} {% macro form(action,value='登录',method='post') %} <form action="action" method="{{ method }}"> <input type="text" placeholder="用户名" name="username"> <br> <input type="password" placeholder="密码" name="password"> <br> <input type="submit" value="{{ value }}"> </form> {% endmacro %} 上面这是用宏封装好的宏,可以调用
在macro1.html文件中
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>宏的定义</title> </head> <body> {#定义宏#} {% macro form(action,value='登录',method='post') %} <form action="action" method="{{ method }}"> <input type="text" placeholder="用户名" name="username"> <br> <input type="password" placeholder="密码" name="password"> <br> <input type="submit" value="{{ value }}"> </form> {% endmacro %} {#调用宏#} {{ form('/') }} </body> </html>
在macro2.html文件中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>宏的使用2</title>
</head>
<body>
{% import 'macro/macro.html' as func %}
{{ func.form('/welcome',value='注册') }}
{% set username='zhangsan' %} # set 声明 是全局变量
{{ username }}
{% with num=1000 %} # with 声明的是局部变量
{{ num }}
{% endwith %}
{{ num }}
</body>
</html>
调用macro文件中的宏form,{% import 'macro/macro.html' as func %}是把macro文件中的宏导过来,'/welcome',value='注册'是传的参数
在welcome.html文件中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>欢迎页面</title>
</head>
<body>
{% include 'common/header.html' %}
<div style="background-color: darkseagreen;height: 100px;"></div>
</body>
</html>
在header.html文件中
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>头部</title> </head> <body> <div style="height:50px;background-color: deeppink"></div> </body> </html>
在base.html文件中
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}父模板的title{% endblock %}</title> {#标记#} <style> #head{ height:50px; background-color: bisque; } #head ul{ list-style: none; height: 50px; } #head ul li{ float:left; width: 100px; text-align: center; font-size: 18px; height: 50px; line-height: 50px; } #middle{ height: 900px; background-color: azure; } #foot{ height: 50px; line-height: 50px; background-color: darkseagreen; } </style> {% block mycc %}{% endblock %} {#标记#} </head> <body> <div id="head"> <ul> <li>首页</li> <li>秒杀</li> <li>超市</li> <li>图书</li> <li>会员</li> </ul> </div> <div id="middle"> {% block middle %} {#标记#} <button id="btn">我是中间部分</button> {% endblock %} </div> <div id="foot"> 我是底部 </div> {% block myjs %} {#标记#} {% endblock %} </body> </html>
在index.html文件中
{% extends 'base.html' %} {% block title %} 首页 {% endblock %} {% block mycc %} <style> #middle{ background-color: deeppink; color: white; font-weight: bold; } .div1{ width: 33%; height: 500px; float: left; border: 1px solid red; } </style> <link rel="stylesheet" href="{{ url_for('static',filename='css/style.css')}}"> {% endblock %} {% block myjs %} <script> btn=document.getElementById('btn') btn.οnclick=(function () { alert('别点我!') }) </script> {% endblock %} {% block middle %} <div class="div1" id="d1"></div> <div class="div1"></div> <div class="div1"></div> <img src="{{ url_for('static',filename='images/43.jpeg') }}" alt=""> {% endblock %} 43.jpeg是张图片
在style.css文件中
#d1{ background-color:aquamarine; }