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 '註冊'
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 %}