一、flask-script扩展库
简介:一个终端运行解释器 通过在终端不同参数的启动来实现不同的功能的启动
安装
pip install flask-script
使用
```
from flsak import Flask
from flask_script import Manager
app =Flask(__name__)
manager =Manager(app)
if __name__ =='__main__':
manager.run()
```
启动参数
>python manage.py runserver -h
完整的启动项参数
>python manage.py runserver -h0.0.0.0 -p5001 -d -r --threaded
>
>正常使用
>
>python manage.py runserver -d -r 开启了debug和reload
二、蓝本 Blueprint
说明:当我们的代码越来越多的时候 所有的代码都写在一个文件中 很明显是不合理的 按照功能进行拆分
导入:from flask import Blueprint
使用:
from flask import Blueprint #导入蓝本
user = Blueprint('user',__name__)
#注册
@user.route('/register/')
def register():
return '注册'
python
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
manager = Manager(app) #实例化终端运行解析器
导入蓝本对象
from user import user
app.register_blueprint(user)#注册蓝本
#app.register_blueprint(user,url_prefix='/user')#注册蓝本
if __name__ =='__main__':
manager.run()#运行
#注意蓝本之间的重定向
如果是蓝本之间的重定向 你需要告诉url_for 是哪一个蓝本对象里面的是视图函数 否则报错
@app.route('/')
def index():
return redirect(url_for('user.register'))#重定向到user蓝本对象里面的register视图函数
三、请求钩子函数
概述
就是类似Django的中间件 middleware
| 钩子函数 | 说明 |
| -------------------- | ----------------------- |
| before_first_request | 第一次请求之前 |
| before_request | 每次请求之前 |
| after_request | 请求之后 |
| teardown_request | 请求之后 即使有异常发生 |
代码:
@app.before_first_request
def before_first_request():
print('before_first_request')
@app.before_request
def before_request():
print('before_request')
if request.method ! ='POST' and request.path =='/form/':
return '禁止访问当前路由'
if not request.headers.get('User-Agent'):
return '抱歉您不是正常的访问'
if request.remote_addr == '127.0.0.1':
return '不可以访问'
@app.after_request
def after_request(res):
print('after_request')
return res
@app.teardown_request
def teardown_request(err):
print('teardown_request')
print('错误信息',err)
四、模板引擎
说明:模板引擎就是按照一定规则进行替换展示的语法规则
模板引擎:flask:jinja2
目录结构:
project/
templates/
common/
base.html
manage.py
导入
from flask import render_template,render_template_string
渲染模板的方法
- render-template()#渲染模板内容进行响应
- render_template_string()响应一段简短的html代码
五、变量和标签
(1) 变量
概述 就是视图函数传递过去的数据
变量命名规则:遵循标识符的命名规则
格式:{{变量名}}
注意:
如果模板中使用了不存在的变量 则插入为空白字符
@app.route('/testtem/')
def testtem():
return render_template('testtem.html',con='软字怎么拼?')
模板中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>测试模板</h2>
<h3>{{ con }}</h3>
<h3>不存在的变量{{ xxxx }}</h3>
</body>
</html>
# 六、标签
**作用:**
1. 在输出中 创建文本
2. 控制逻辑和循环
**格式:**
{% 标签名 %}
#### (1) if
**主体结构**
```python
{% if ... %}
...
{% elif ... %}
...
{% else %}
...
{% endif %}
(2) for
标签
{% for ... in ...%}
...
{}
注意:
django模板中的for和empty搭配 flask和else搭配 使用相同
当迭代的变量不存在 则执行
[1] 迭代索引
{% for i in range(5) %}
<li>{{ i }}</li>
{% endfor %}
</ul>
[2] 迭代字典
{% for k,v in Dict.items() %}
<li>{{ k }}===>{{ v }}</li>
{% else %}
<h3>你什么时候能看到我?</h3>
{% endfor %}
</ul>
获取迭代的状态
变量 | 说明 |
---|---|
loop.index | 迭代索引从1开始 |
loop.index0 | 迭代索引从0开始 |
loop.first | 是否为第一次迭代 |
loop.last | 是否为最后一次迭代 |
loop.length | 迭代长度 |
(3) 注释
单行多行
{# 注释的内容 #}
七、文件包含 include
include: 把公共的代码 同一放到一个文件 中 进行导入
注意:
include 会将导入的文件的内容 全部类似于粘贴到你 include的位置上
格式
{% include ‘路径/文件名.html’ %}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body{
padding: 0;
margin:0;
}
nav{
width: 100%;
height:60px;
background-color: #000;
line-height: 60px;
}
nav a{
color: #fff;
font-size: 16px;
text-decoration: none;
}
nav span{
float: right;
}
footer{
width: 100%;
height: 100px;
background-color: orange;
position: absolute;
bottom:0;
}
</style>
</head>
<body>
{% include 'common/header.html' %}
<div id="con">
<h2>中间内容部分</h2>
</div>
{% include 'common/footer.html' %}
</body>
</html>
common/header.html
<nav>
<span>
<a href="">登录</a> |
<a href="">注册</a>
</span>
</nav>
common/footer.html
<footer></footer>
八、模板继承
标签:
-
extends
继承使用
-
block
对于父模板进行替换和添加新的block
-
{{ super() }}
对子模板替换掉的内容调用回来
实例
common/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 link %}
{% endblock %}
{% block scripts %}
{% endblock %}
{% endblock %}
</head>
<body>
{% block body %}
<h2>body体</h2>
{% endblock %}
</body>
</html>
{% endblock %}
test_base.html
{% extends 'common/base.html' %}
{% block title %}
我是子模板
{% endblock %}
{% block body %}
{{ super() }}
<h2>我是子模板的内容</h2>
{% endblock %}
九、flask-bootstrap扩展库
安装:
pip3 install flask-bootstrap
使用
from flask_bootstrap import Bootstrap
bootstrap = Bootstrap(app)
自定义base模板
{% extends 'bootstrap/base.html' %}
{% block title %}
我是继承bootstrap的子模板文件
{% endblock %}
{% 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">Submit</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><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 %}