flask02

版权声明:转载请注明出处 https://blog.csdn.net/qq_42806416/article/details/83547311

一、flask-script扩展库

简介:

一个终端运行的解析器 通过在终端不同参数的启动来实现不同功能的启动 django一样的启动发送

安装:

pip3 install flask-script

使用

from flask import Flask
from flask_script import Manager

app = Flask(__name__)
manager = Manager(app)
...
if __name__ == '__main__':
    manager.run()

启动参数

python3 manage.py runserver -h

完整的启动项参数

python3 manage.py runserver -h0.0.0.0 -p5001 -d -r --threaded

正常使用

python3 manage.py runserver -d -r 开启debug和reload

二、蓝本 Blueprint

说明:

当我们的代码越来越多的时候 所有的代码都写在一个文件中 很明显是不合理的 按照功能进行拆分

导入:

from flask import Blueprint

使用:

新建一个user.py的蓝本文件

from flask import Blueprint #导入蓝本

user = Blueprint('user',__name__)

#注册
@user.route('/register/')
def register():
    return '注册'

manage.py

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

渲染模板的方法

  1. render_template()

    渲染模板内容进行响应

  2. 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

主体结构

{% 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>

八、模板继承

标签:

  1. extends

    继承使用

  2. block

    对于父模板进行替换和添加新的block

  3. {{ 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 %}

猜你喜欢

转载自blog.csdn.net/qq_42806416/article/details/83547311