1. 程式人生 > >flask=======模板

flask=======模板

一、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 '註冊'

manage.py

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
渲染模板的方法

  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

**主體結構**

```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>

八、模板繼承

標籤:

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