Day2 模板
一、flask-script扩展库
概述:
是一个flask终端运行解析器 因为在代码写完以后 就不需要有任何的修改 因为任何的修改都有可能带来风险 所有我们要在终端通过不同参数 来进行项目的启动
安装
pip3 install flask-script
导入
from flask import Flask
#导入终端运行解析器
from flask_script import Manager
app = Flask(__name__)
manager = Manager(app) #对类进行实例化
@app.route('/')
def index():
return 'index'
if __name__ == '__main__':
# app.run(debug=True)
manager.run()
参数
在终端输入
python3 manage.py runserver -?
参数 说明
-h 主机
-p 端口
-d 调试debug
-r 重新加载reload
--threaded 开启多线程
完整的启动
python3 manage.py runserver -h0.0.0.0 -p5000 -d -r --threaded
python3 manage.py -d -r
二、蓝本 blueprint
概述
当我们项目的代码越来越多的时候 所有的代码都放在一个文件中 很明显是不合理的 我们要按照模块功能进行划分 蓝本就是为了解决这个问题而出现的
使用:
user.py
from flask import Blueprint #导入蓝本
user = Blueprint('user',__name__) #实例化蓝本 括号里面的user为当前蓝本名称
@user.route('/login/')
def login():
return 'login'
manage.py 注册蓝本
from user import user #导入蓝本对象 user
# app.register_blueprint(user) #注册蓝本对象
app.register_blueprint(user,url_prefix='/user') #注册蓝本对象
current_app:
全局能够访问并且拿到 flask的公共配置信息
模板
一、模板引擎概念
模板文件 就是按照一定的规则 书写的一个负责页面展示效果的替换规则
Jinja2:
是由flask核心成员负责开发的 flask使用的模板引擎为Jinja2
二、模板创建使用
目录层级
project/
manage.py
templates/
(1) 渲染模板
导入:
from flask import render_template,render_template_string
- 渲染模板
render_template() - 渲染一段简短的html内容
render_template_string()
实例
@temtest.route('/test/')
def test():
return render_template_string('<p style="border:1px solid red;color:blue;">render_template_string</p>')
return render_template('index.html')
(2) 变量
格式:
{{ 变量名称 }}
使用:
- 变量就是视图函数传递给模板的数据
- 变量要遵循标识符的命名规则
- 如果模板中的变量不存在 则插入空字符串(什么都没有)
实例
return render_template('index.html',title='我是页面标题')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<h2>首页</h2>
<h3>{{ notdefind }}</h3>
</body>
</html>
(3) 标签
格式
{% 标签名称 %}
- if
格式
{% if value %}
{% elif value %}
{% else %}
{% endif %}
- for
格式
{% for v in value %}
...
{% else %}
...
{% endfor %}
实例
{#{% for v in title %}#}
{% for v in notdefind %}
<li>{{ v }}</li>
{% else %}
<li>当迭代的变量不存在则执行else(也就是django的empty)</li>
{% endfor %}
迭代字典
实例
{#{% for k in Dict %}#}
{% for k,v in Dict.items() %}
<li>{{ k }}==>{{ v }}</li>
{% endfor %}
注意:
在django里 items是属性 在flask里是方法
迭代序列
{% for i in range(10) %}
<li>{{ i }}</li>
{% endfor %}
获取迭代状态
变量 说明
loop.index 获取当前迭代的索引 从1开始
loop.index0 获取当前迭代的索引 从0开始
loop.first 是否为第一次迭代
loop.last 是否为最后一次迭代
loop.length 迭代的长度
- 注释
多行注释
{# 注释内容 #}
三、文件包含 include
使用include语句 把一个模板整体包含到另外的一个模板中 实现代码的复用 就三相当于把一个模板的代码拷贝到了你的include的位置
testinclude.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
testinclude.html
</body>
</html>
index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
{% include 'common/testinclude.html' %}
</body>
</html>
注意:
我们的index里面就会有俩个主体结构标签 这样是不符合html的语法规则 证明了 include会将一个模板的所有代码 都拷贝到include的代码的位置
四、模板继承 extends
组成
- extends 继承父模板
- block 对模板进行留出替换的余地
- {{ super() }} 对替换掉的模板代码 在次调用回来就是django中的{{ block.super }}
base.html
{% block doc %}
<!DOCTYPE html>
<html lang="en">
<head>
{% block head %}
{% block meta %}
<meta charset="UTF-8">
{% endblock %}
<title>{% block title %}title{% endblock %}</title>
{% block styles %}
{% endblock %}
{% block link %}
{% endblock %}
{% block script %}
{% endblock %}
{% endblock %}
</head>
<body>
{% block body %}
<h2>base的代码</h2>
{% endblock %}
</body>
</html>
{% endblock %}
testextends,html
{% extends 'common/base.html' %}
{% block title %}
测试模板页面
{% endblock %}
{% block body %}
测试模板页面
{{ super() }}
阿三大赛的<font color="aqua">阿斯顿阿</font>斯顿
{% endblock %}
五、macro 宏
定义
{% macro 宏的名称([可选参数]) %}
...代码块
{% endmacro %}
宏的使用
{{ 宏的名称([可选的实参]) }}
实例
{% macro form(context="",type="text",name="",value="",placeholder="",minlength=6,maxlength=12) %}
<p>{{ context }}<input type="{{ type }}" name="{{ name }}" value="{{ value }}" maxlength="{{ maxlength }}" minlength="{{ minlength }}" placeholder="{{ placeholder }}"></p>
{% endmacro %}
<form action="" method="post">
{{ form('用户名: ',name="username",placeholder='请输入用户名') }}
{{ form('密码: ','password','userpass',placeholder='请输入密码') }}
{{ form('','submit',value='submit') }}
</form>
宏的导入
common/formmacro.html
{% from 'common/formmacro.html' import form %}
{% from 'common/formmacro.html' import form as myForm %}
{% import 'common/formmacro.html' as myForm %}
<form action="" method="post">
{{ myForm.form('用户名: ',name="username",placeholder='请输入用户名') }}
{{ myForm.form('密码: ','password','userpass',placeholder='请输入密码') }}
{{ myForm.form('','submit',value='submit') }}
</form>
注意:
- 宏的定义和函数一样 只能在宏定义的下方去调用
- 如果宏有形参 且没有 默认值 则可以不传实参 则形参值为空字符
- 如果宏有形参且有默认值 调用不传实参 则形参的值为默认值
- 如果宏有形参且有默认值 调用传实参 则形参的值为实参的值
- 可以给关键字参数 指定形参名给值
- 形参在定义的时候 要遵循默认值的规则 也就是 有形参默认值的放在右侧 没有的放在左侧
六、flask-bootstrap
安装:
pip3 install flask-bootstrap
使用
from flask_bootstrap import Bootstrap
app = Flask(__name__)
bootstrap = Bootstrap(app) #实例化Bootstrap
制定bootstrap多的base
{% extends 'bootstrap/base.html' %}
{% block navbar %}
<nav class="navbar navbar-inverse" style="border-radius: 0;">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Brand</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active"><a href="#">首页 <span class="sr-only">(current)</span></a></li>
<li><a href="#">发表博客</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<form class="navbar-form navbar-left">
<div class="form-group">
<input type="text" class="form-control" placeholder="Search">
</div>
<button type="submit" class="btn btn-default">搜索</button>
</form>
<li><a href="#">登录</a></li>
<li><a href="#">注册</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">个人中心 <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">修改用户名</a></li>
<li><a href="#">修改密码</a></li>
<li><a href="#">上传头像</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">退出登录</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
{% endblock %}
{% block content %}
<div class="container">
{% block pagecontent %}
<h2>这是我们自己定义的base 以后所有的子模板都继承我就好</h2>
{% endblock %}
</div>
{% endblock %}
制定错误模板
manage.py
@app.errorhandler(404)
def page_not_found(err):
return render_template('error.html',title='404 PAGE_NOT_FOUND',info=err,con='页面被外星人抓走了')
@app.errorhandler(500)
def server_error(err):
return render_template('error.html',title='500 SERVER_ERROR',info=err,con='您的访问太热情了 请稍候在尝试访问')
error.html
{% extends 'common/boot_base.html' %}
{% block title %}
{{ title }}
{% endblock %}
{% block pagecontent %}
<div class="alert alert-danger alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
<strong>{{ con }}</strong>{{ info }}
</div>
{% endblock %}
{# 根据404和500对应显示出友好的图片的展示 #}
七、视图函数传递多个参数渲染模板的方法
(1) 原始办法 关键字参数
def page_not_found(err):
return render_template('error.html',title='404 PAGE_NOT_FOUND',info=err,con='页面被外星人抓走了')
(2) locals()
def index():
a = 'a'
b = 'b'
print(locals()) #{'a':'a','b':'b'}
# return 'index'
return render_template('index.html',**locals())
(3) 使用字典方式
def index():
return render_template('index.html',**{'a':'a','b':'b'})
(4) 全局变量g 作为一个完整请求数据的存储
导入g
from flask import g
def index():
g.a = 'a'
g.b = 'b'
return render_template('index.html')
八、加载静态资源
新建资源目录static
目录结构
project/
static/
img/
abc.jpeg
templates/
实例
<img src="{{ url_for('static',filename='img/abc.jpeg',_external=True) }}" alt="">
网友评论