一、flask-script扩展库
作用:
flask终端运行解析器 和django一样
安装:
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()
manager.run()
终端启动项参数
参数名称 | 参数说明 |
---|---|
-h | HOST 主机 |
-p | PORT 端口 |
-d | debug 开启调试模式 |
-r | reload 重新加载 |
–threaded | 开启多线程 |
python3 manage.py runserver -? 获取启动项参数
python3 manage.py runserver -h0.0.0.0 -p5001 -d -r --threaded
python3 manage.py runserver -d -r
二、session
将数据存储在服务器端 并给客户端浏览器设置一个cookie sessionid 唯一标识符 通过唯一sessionid 来确定当前的访问用户
注意:
需要设置secret_key
sessionid需要 scrf_token hash加密 在django里自带的
导入:
from flask import session
(1) 设置session
#设置session
@app.route('/set_session/')
def set_session():
session['message'] = '你住在哪里? 住在我心里'
return '设置session'
(2) 设置session并设置过期时间
from datetime import timedelta #计算时间的差值
#设置session并设置过期时间
@app.route('/set_sessino_lefttime/')
def set_sessino_lefttime():
session.permanent = True #设置sesssion持久化存储
app.permanent_session_lifetime = timedelta(minutes=60)
session['message'] = '你住在哪里? 住在我心里'
return '设置session并设置过期时间'
(3) 获取session
#获取session
@app.route('/get_session/')
def get_session():
return '获取session {}'.format(session.get('message'))
(4) 删除session
#删除session
@app.route('/del_session/')
def del_session():
#删除某一个session值
session.pop('message')
#删除所有session
session.clear()
return '删除session'
三、蓝本 blueprint
说明:
当代码越来越多的时候 所有的代码都放在一个文件里 很明显是不合理的 所以要按照不同的功能进行模块的划分 通过蓝本来实现
导入:
from flask import Blueprint
使用
from flask import Blueprint #导入蓝本
user = Blueprint('user',__name__)
@user.route('/login/')
def login():
return '登录'
#导入蓝本对象
from user import user
# app.register_blueprint(user) #注册蓝本对象user
app.register_blueprint(user,url_prefix='/user') #注册蓝本对象user 添加前缀
注意:
Blueprint参数name的值 要起有意义的 代表哪个蓝本
模板 Templates
说明:
模板就是按照一定规则进行替换展示html代码文件 模板引擎提供了替换规则
flask模板引擎:
Jinja2
一、创建模板目录和渲染
目录结构
project/
templates/
manage.py
渲染模板
- render_template() 渲染模板
- render_template_string() 渲染一段html代码进行响应
实例:
@app.route('/')
def index():
# return render_template('index.html')
return render_template_string("<p style='color:red;'>拼搏到无能为力 坚持到感动自己!!!</p>")
二、模板中的变量和标签
格式:
-
变量 {{ 变量名称 }}
-
标签 {% 标签名 %}
变量的使用
实例
@app.route('/')
def index():
return render_template('index.html',title='首页',message='拼搏到无能为力 坚持到感动自己!')
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{# <title>Title</title>#}
<title>{{ title }}</title>
</head>
<body>
{{ message }}
</body>
</html>
标签
(1) if
主体结构
{% if val %}
...
{% elif val %}
...
{% else %}
...
{% endif %}
条件操作符号的使用:
> < >= <= == != and or in not in not
实例
{% if grade >= 90 %}
<p>优</p>
{% elif grade >= 80 %}
良
{% elif grade >= 70 %}
中
{% elif grade >= 60 %}
合格
{% else %}
不合格
{% endif %}
(2) for 循环
主体结构
{% for ... %}
...
{% else %}
... 当迭代的变量不存在 则执行else
{% endfor %}
实例
{#{% for i in range(10) %}#}
{% for i in abc %}
{{ i }} <br>
{% else %}
<p>你能不能看到我?</p>
{% endfor %}
迭代字典
{#for 循环迭代字典#}
{% for k,v in Dict.items() %}
<p>{{ k }}===>{{ v }}</p>
{% endfor %}
注意:
在django模板中 items是属性调用 flask模板中 items是方法的调用
获取for循环迭代的状态
变量名称 | 变量说明 |
---|---|
loop.index | 获取当前索引 从1开始 |
loop.index0 | 获取当前索引 从0开始 |
loop.first | 是否为第一次迭代 |
loop.last | 是否为最后一次迭代 |
loop.length | 迭代的长度 |
实例
{% for i in range(10) %}
<p>{{ loop.index }} ====> {{ loop.index0 }} ====> {{ loop.first }} ====>{{ loop.last }}=====> {{ loop.length }}</p>
{% endfor %}
三、注释
{# 注释的内容 #}
注意:
flask的模板引擎注释 是多行注释
四、文件包含 include
使用
{% include ‘路径/文件名称.html’ %}
test_include.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body,a{
padding: 0;
margin: 0;
text-decoration: none;
}
header,footer{
width: 100%;
height: 40px;
background-color: #000;
color:#fff;
}
footer{
height: 80px;
background-color: orange;
position: fixed;
bottom: 0;
}
</style>
</head>
<body>
{% include 'common/header.html' %}
<div id="con">
<h2>我是中间内容部分</h2>
</div>
{% include 'common/footer.html' %}
</body>
</html>
common/header.html
<header>
<h2>我是header</h2>
</header>
common/footer.html
<footer>
<h2>我是footer</h2>
</footer>
五、macro 和宏
宏的定义
{% macro 宏的名称(可选参数) %}
...
{% endmacro %}
说明:
类似python中的函数
实例
{% macro form(con='',type='text',name='',value='') %}
<p>{{ con }}<input type="{{ type }}" name="{{ name }}" value="{{ value }}"></p>
{% endmacro %}
调用
<form action="">
{{ form('用户名:',name='username') }}
{{ form('密码:','password','userpass') }}
{{ form(type='submit',value='submit') }}
</form>
宏的导入
- from 路径/宏的文件名称.html import 宏名
- import ‘路径/宏的文件名称.html’ as 别名
实例
{% from 'common/formmacro.html' import form %}
{% from 'common/formmacro.html' import form as form1 %} #导入并起别名
{% import 'common/formmacro.html' as formformmacro %}
<form action="">
{{ formformmacro.form('用户名:',name='username') }}
{{ formformmacro.form('密码:','password','userpass') }}
{{ formformmacro.form(type='submit',value='submit') }}
</form>
注意:
- 宏的调用和函数一样 需要在定义的下方去调用
- 宏如果有形参且没有默认值 则可以不传实参 因为变量不存在值什么都没有
- 宏的参可以有形参 和函数定义一样
- 形参默认值遵循默认值规则
- 调用的时候 可以传递关键字参数 要遵循关键字参数的规则
六、模板继承
- extends 继承
- block 对于父模块的替换和标记
新建一个base.html
{% block doc %}
<!DOCTYPE html>
<html lang="en">
<head>
{% block head %}
<meta charset="UTF-8">
<title>{% block title %}标题{% endblock %}</title>
{% block meta %}
{% endblock %}
{% block linkestyle %}
{% endblock %}
{% block styles %}
{% endblock %}
{% endblock %}
</head>
<body>
{% block body %}
body中的内容
{% endblock %}
</body>
</html>
{% endblock %}
test_base.html
{% extends 'common/base.html' %}
{% block title %}
test_base测试基础模板
{% endblock %}
{% block body %}
{{ super() }}
<h2>test_base测试基础模板</h2>
{% endblock %}
注意:
复用父模板的代码使用 {{ super() }}
其它的使用和 django一样
七、flask-bootstrap 扩展库
安装:
pip3 install flask-bootstrap
使用:
from flask_bootstrap import Bootstrap
bootstrap = Bootstrap(app) #实例化bootstrap类
实例:
{% extends 'bootstrap/base.html' %}
{% block title %}
test_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 %}