您好,登錄后才能下訂單哦!
什么是Flask?
Flask是一個Web框架,就是提供一個工具,庫和技術(shù)來允許你構(gòu)建一個Web應(yīng)用程序.這個Web應(yīng)用程序
可以是一些Web頁面,博客, wiki ,基于 Web 的日歷應(yīng)用或商業(yè)網(wǎng)站。
Flask依賴模塊:
web服務(wù)網(wǎng)關(guān)接口(Python Web Server Gateway Interface,縮寫為WSGI
Werkzeug 一個WSGI工具包, 是為python語言定義的web服務(wù)器和web應(yīng)用程序或框架之間的一
種簡單而通用的借口,其他語言也有類似的接口)
jinja2模板引擎
Flask屬于微框架( micro-framework )這一類別,微架構(gòu)通常是很小的不依賴外部庫的框架.
框架很輕量
更新時依賴小
專注于安全方面的bug
from flask import Flask
app = Flask(__name__) #導(dǎo)入Flask對象
@app.route('/') #把修飾的函數(shù)注冊為路由
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
要給url添加變量部分,可以把這些特殊的字符標(biāo)記為<variable_name> 這部分將會作為命名參數(shù)傳遞到你的函數(shù)
from flask import Flask
app = Flask(__name__) #創(chuàng)建對象
@app.route('/')
def hello_world():
return 'Hello World'
@app.route('/user/<username>')
def show_user_profile(username):
# 顯示該用戶名的用戶信息
return 'User %s' % username
@app.route('/post/<int:post_id>')
def show_post(post_id):
# 根據(jù)ID顯示文章,ID是整型數(shù)據(jù)
return 'Post %d' % post_id
if __name__ == '__main__':
app.run()
運(yùn)行程序?qū)g覽器地址修改成 http://127.0.0.1:5000/user/歷史
則顯示:
如果flask能匹配url,那末你可以用url_info()來給指定的函數(shù)
構(gòu)建url ,他接收函數(shù)名作為第一個參數(shù),也接受對應(yīng)url規(guī)則的變量部分的命名參數(shù),未知變量部分會添加到url末尾作為查詢參數(shù)
from flask import Flask , url_for
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/user/<username>')
def show_user_profile(username):
# 顯示該用戶名的用戶信息
return 'User %s' % username
@app.route('/post/<int:post_id>')
def show_post(post_id):
# 根據(jù)ID顯示文章,ID是整型數(shù)據(jù)
return 'Post %d' % post_id
@app.route('/url/')
def get_url():
# 根據(jù)ID顯示文章,ID是整型數(shù)據(jù)
return url_for('show_post',post_id=2)
if __name__ == '__main__':
app.run(debug=True)
瀏覽器訪問url:
當(dāng)用戶訪問程序的根地址時,我們的視圖函數(shù)會向客
戶端返回一行HTML代碼。然而,一個完整的HTML頁面往往需要幾十
行甚至上百行代碼,如果都寫到視圖函數(shù)里,那可真是個噩夢。這樣的
代碼既不簡潔也難于維護(hù),正確的做法是把HTML代碼存儲在單獨(dú)的文
件中,以便讓程序的業(yè)務(wù)邏輯和表現(xiàn)邏輯分離,即控制器和用戶界面的
分離。
在動態(tài)Web程序中,視圖函數(shù)返回的HTML數(shù)據(jù)往往需要根據(jù)相應(yīng)
的變量(比如查詢參數(shù))動態(tài)生成。當(dāng)HTML代碼保存到單獨(dú)的文件中
時,我們沒法再使用字符串格式化或拼接字符串的方式來在HTML代碼
中插入變量,這時我們需要使用模板引擎(template engine)。借助模
板引擎,我們可以在HTML文件中使用特殊的語法來標(biāo)記出變量,這類
包含固定內(nèi)容和動態(tài)部分的可重用文件稱為模板(template)。
模板引擎的作用就是讀取并執(zhí)行模板中的特殊語法標(biāo)記,并根據(jù)傳
入的數(shù)據(jù)將變量替換為實(shí)際值,輸出最終的HTML頁面,這個過程被稱
為渲染(rendering)。Flask默認(rèn)使用的模板引擎是Jinja2,它是一個功
能齊全的Python模板引擎,除了設(shè)置變量,還允許我們在模板中添加if
判斷,執(zhí)行for迭代,調(diào)用函數(shù)等,以各種方式控制模板的輸出。對于
Jinja2來說,模板可以是任何格式的純文本文件,比如HTML、XML、
CSV、LaTeX等
在該文件下創(chuàng)建templates文件夾,然后創(chuàng)建2個文件,分別命名為index.html和user.html 然后render.py 渲染這些模板
from flask import Flask, render_template
app= Flask(__name__)
@app.route('/')
def hello_world():
return render_template('index.html',name='經(jīng)驗(yàn)')
@app.route('/user/<username>')
def show_user_profile(username):
# 顯示該用戶名的用戶信息
return render_template('user.html', name=username)
if __name__ == '__main__':
app.run(debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>hello, {{ name }}!</h2>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>hello {{ name }} </h2>
</body>
</html>
瀏覽器:
利用Jinja2這樣的模板引擎,我們可以將一部分的程序邏輯放到模
板中去。簡單地說,我們可以在模板中使用Python語句和表達(dá)式來操作
數(shù)據(jù)的輸出。但需要注意的是,Jinja2并不支持所有Python語法。而且
出于效率和代碼組織等方面的考慮,我們應(yīng)該適度使用模板,僅把和輸
出控制有關(guān)的邏輯操作放到模板中。
Jinja2允許你在模板中使用大部分Python對象,比如字符串、列
表、字典、元組、整型、浮點(diǎn)型、布爾值。它支持基本的運(yùn)算符號
(+、-、*、/等)、比較符號(比如==、!=等)、邏輯符號(and、
or、not和括號)以及in、is、None和布爾值(True、False)。
Jinja2提供了多種控制結(jié)構(gòu)來控制模板的輸出,其中for和if是最常用
的兩種。在Jinja2里,語句使用{%...%}標(biāo)識,尤其需要注意的是,在語
句結(jié)束的地方,我們必須添加結(jié)束標(biāo)簽:
{% if user.bio %}
<i>{{ user.bio }}</i>
{% else %}
<i>This user has not provided a bio.</i>
{% endif %}
在這個If語句里,如果user.bio已經(jīng)定義,就渲染{%if user.bio%}和
{%else%}之間的內(nèi)容,否則就渲染{%else%}和{%endif%}之間的默認(rèn)內(nèi)容。末尾的{%endif%}用來聲明if語句的結(jié)束,這一行不能省略。
和在Python里一樣,for語句用來迭代一個序列:
<ul>
{% for movie in movies %}
<li>{{ movie.name }} - {{ movie.year }}</li>
{% endfor %}
</ul>
{{ 變量名| 函數(shù)調(diào)用 }}
{{ name }}
{{ url_for() }}
{{ get_flshed_messages() }}
"hello".lower()
safe 渲染值時不轉(zhuǎn)義
capitalize 把值的首字母轉(zhuǎn)換成大寫,其他字母轉(zhuǎn)換成小寫
lower 把值轉(zhuǎn)換成小寫形式
upper 把值轉(zhuǎn)換成大寫形式
title 把值中每個單詞的首字母都轉(zhuǎn)換成大寫
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的 HTML 標(biāo)簽都刪掉
{% for i in li%}
xxx
{% endfor %}
{% if user == 'westos'%}
xxxx
{% elif user == 'hello' %}
xxx
{% else %}
xxx
{% endif%}
<!--相當(dāng)于python里面的定義函數(shù), 后面使用的場景: 分頁顯示-->
{% macro render(id) %}
<h2>hello world {{ id }}</h2>
{% endmacro %}
<!--調(diào)用定義好的宏(類似于python中的函數(shù))-->
{{ render(1) }}
{{ render(2) }}
{{ render(3) }}
一般網(wǎng)站的導(dǎo)航欄和底部不會變化, 為了避免重復(fù)編寫導(dǎo)航欄信息;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %} {% endblock %}</title>
</head>
<body>
<div > 這是導(dǎo)航欄</div>
{% block body %}
hello
{% endblock %}
<div >這是底部</div>
</body>
</html>
- 如何繼承基模板?
{% extends '06_base.html'%}
{% block title %}
繼承案例
{% endblock %}
{% block body %}
<span >這是最新填的block內(nèi)容</span>
{% endblockfrom flask import Flask, render_template
例:模板繼承py:
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/bbs/')
def bbs():
return render_template('bbs.html')
@app.route('/blog/')
def blog():
return render_template('blog.html')
if __name__ == '__main__':
app.run(port=5002) %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %} {% endblock %}</title>
<style>
.nav{
width: 100%;
height: 50px;
border: 1px solid red;
}
.left{
width: 20%;
border: 1px solid red;
float: left;
height: 100px;
}
.right{
width: 79%;
border: 1px solid green;
float: left;
height: 100px;
}
</style>
</head>
<body>
<div class="nav">
導(dǎo)航欄
<button>登錄</button>
<button>注冊</button>
</div>
<div class="left">
{% include 'left.html' %}
</div>
<div class="right">
{% block body %}
{% endblock %}
</div>
</body>
</html>
{% extends 'base.html' %}
{% block title %}
論壇
{% endblock %}
{% block body %}
<h2>bbs</h2>
{% extends 'base.html' %}
{% block title %}
博客
{% endblock %}
{% block body %}
<h2>blog</h2>
{% extends 'base.html' %}
{% block title %}
主頁
{% endblock %}
{% block body %}
<h2>index</h2>
<ul>
<li>新聞</li>
<li>財(cái)經(jīng)</li>
<li>八卦</li>
<url>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。