在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文件中
首页
注册
登录
展示
在register.html文件中
用户注册页面
京东注册页面
{#如果是表单提交则必须在表单的元素上添加name属性#}
模板语法
"""
视图函数的返回值:
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='520快乐!'
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() %} 获取值
{{ v }}
{% endfor %}
{% for k,v in users.0.items() %} 获取键值
{{ k }}--{{ v }}
{% endfor %}
{% for k in users.0.keys() %} 获取键
{{ k }}
{% 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文件中
展示
用户信息展示
用户名是:{{ name }}--{{ age }}
{{ friends.0 }}
{{ friends[1] }}
{{ friends[:1] }}
{{ dict1.gift1 }}--{{ dict1.get('gift') }}
{{ girl.gender }}--{{ girl.name }}--{{ girl.addr }}
在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文件中
演示控制块
.a{
color:red;
font-weight: bold;
}
{#ul....li#}
{#ol....li#}
{#{{ girls }}#}
{% for girl in girls %} {#遍历出来,for的应用#}
- {{ girl }}
{% endfor %}
{% for girl in girls %} {#for 和 if 的应用#}
{% if girl|length>=3 %} {#如果字数大于等于3#}
- {{ girl }}
{#字体变红加粗#}
{% else %} {#否则#}
- {{ girl }}
{% endif %}
{% endfor %}
{% for user in users %}
{{ user.username }}
{{ user.password }}
{{ user.addr }}
{{ user.phone }}
{% endfor %}
{% for user in users %}
{# #}
{{ loop.index }} {#序号从1开始#}
{# {{ loop.index0 }} #} {#序号从0开始#}
{# {{ loop.revindex }} {#序号倒着开始#}
{{ user.username }}
{{ user.password }}
{{ user.addr }}
{{ user.phone }}
{% endfor %}
在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='520快乐!'
n1='hello'
return render_template('show_2.html',girls=girls,users=users,msg=msg,n1=n1)
if __name__=='__main__':
app.run()
在show_2.html文件中
过滤器的使用
当前用户共:{{ girls |length}}人
{#过滤器转译#}
{{ msg |safe }}
{{ n1|capitalize }}
{{ n1|upper }}
{{n1|reverse}}
{{ '%s is %d years old'| format('lili',18) }}
{{ 'hello world'| truncate(5) | upper }}
{#列表过滤器的使用#}
{{ girls|first }}
{{ girls|last }}
{{ girls|length }}
{#{{ girls|sum }}整形的计算#}
{{ [1,3,5,7,8]|sum }}
{{ [1,6,5,4,8]|sort }}
{{ users.0 }}
{% for v in users.0.values() %}
{{ v }}
{% endfor %}
{% for k,v in users.0.items() %}
{{ k }}--{{ v }}
{% endfor %}
{% for k in users.0.keys() %}
{{ k }}
{% endfor %}
在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文件中
自定义过滤器
{{ msg }}
{{ msg| replace }}
{{ li }}
{{ li|listreverse }}
复用
模板继承
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') %}
{% endmacro %}
上面这是用宏封装好的宏,可以调用
在macro1.html文件中
宏的定义
{#定义宏#}
{% macro form(action,value='登录',method='post') %}
{% endmacro %}
{#调用宏#}
{{ form('/') }}
在macro2.html文件中
宏的使用2
{% import 'macro/macro.html' as func %}
{{ func.form('/welcome',value='注册') }}
{% set username='zhangsan' %} # set 声明 是全局变量
{{ username }}
{% with num=1000 %} # with 声明的是局部变量
{{ num }}
{% endwith %}
{{ num }}
调用macro文件中的宏form,{% import 'macro/macro.html' as func %}是把macro文件中的宏导过来,'/welcome',value='注册'是传的参数
在welcome.html文件中
欢迎页面
{% include 'common/header.html' %}
在header.html文件中
头部
在base.html文件中
{% block title %}父模板的title{% endblock %} {#标记#}
#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;
}
{% block mycc %}{% endblock %} {#标记#}
- 首页
- 秒杀
- 超市
- 图书
- 会员
{% block middle %} {#标记#}
{% endblock %}
我是底部
{% block myjs %} {#标记#}
{% endblock %}
在index.html文件中
{% extends 'base.html' %}
{% block title %}
首页
{% endblock %}
{% block mycc %}
#middle{
background-color: deeppink;
color: white;
font-weight: bold;
}
.div1{
width: 33%;
height: 500px;
float: left;
border: 1px solid red;
}
{% endblock %}
{% block myjs %}
{% endblock %}
{% block middle %}
{ url_for('static',filename='images/43.jpeg') }}" alt="">
{% endblock %}
43.jpeg是张图片
在style.css文件中
#d1{
background-color:aquamarine;
}



