国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Flask框架基礎(chǔ)(二)

lpjustdoit / 3504人閱讀

摘要:處理和函數(shù)之間關(guān)系的程序稱為路由。模板引擎是由實(shí)現(xiàn)的是內(nèi)置的模板語(yǔ)言參照設(shè)計(jì)思想設(shè)計(jì)的,跟差不多渲染模板默認(rèn)情況下,在程序文件夾中的子文件夾中尋找模板。如果需要可在文件夾中使用子文件夾存放文件。

1 程序的基本結(jié)構(gòu) 1.1初始化

所有Flask 程序都必須創(chuàng)建一個(gè)程序?qū)嵗eb 服務(wù)器使用一種名為Web 服務(wù)器網(wǎng)關(guān)接口(Web Server Gateway Interface,WSGI)的協(xié)議,把接收自客戶端的所有請(qǐng)求都轉(zhuǎn)交給這個(gè)對(duì)象處理。程序?qū)嵗荈lask 類的對(duì)象。

from flask import Flask
app = Flask(__name__)

傳入Flask構(gòu)造方法的第一個(gè)參數(shù)是模塊或者包的名稱,我們應(yīng)該使用特殊變量 __name __。
Python會(huì)根據(jù)所處的模塊來(lái)賦予 __ name __變量相應(yīng)的值,對(duì)于我們程序來(lái)說(shuō),這個(gè)值為app

1.2注冊(cè)路由

客戶端(例如Web 瀏覽器)把請(qǐng)求發(fā)送給Web 服務(wù)器,Web 服務(wù)器再把請(qǐng)求發(fā)送給Flask
程序?qū)嵗3绦驅(qū)嵗枰缹?duì)每個(gè)URL 請(qǐng)求運(yùn)行哪些代碼,所以保存了一個(gè)URL 到Python 函數(shù)的映射關(guān)系。處理URL 和函數(shù)之間關(guān)系的程序稱為路由。

@app.route("/")
def index():
return "

Hello World!

"

在這個(gè)程序中,app.route()裝飾器把根地址/和index()函數(shù)綁定起來(lái),當(dāng)用戶訪問這個(gè)URL時(shí)就會(huì)觸發(fā)index()函數(shù)。視圖函數(shù)index()返回 " Hello World! "

route()裝飾器的第一個(gè)參數(shù)是URL規(guī)則,用字符串表示,必須以/開始。這里的URL是相對(duì)的URL(又稱內(nèi)部URL),即不包含域名的URL,以域名www.google.com為例,“/”對(duì)應(yīng)的是根地址,即www.google.com,如果把URL規(guī)則改為“/maps”,則實(shí)際的絕對(duì)地址為www.google.com/maps

動(dòng)態(tài)路由

如果你仔細(xì)觀察日常所用服務(wù)的某些URL 格式,會(huì)發(fā)現(xiàn)很多地址中都包含可變部分。例如, 你的Facebook 資料頁(yè)面的地址是http://www.facebook.com/, 用戶名(your-name)是地址的一部分。Flask 支持這種形式的URL,只需在route 修飾器中使用特殊的句法即可。下例定義的路由中就有一部分是動(dòng)態(tài)名字:

@app.route("/user/")
def user(name):
return "

Hello, %s!

" % name
1.3啟動(dòng)服務(wù)器

程序?qū)嵗胷un 方法啟動(dòng)Flask 集成的開發(fā)Web 服務(wù)器:

if __name__ == "__main__":
app.run(debug=True)

name__==" main__"是Python 的慣常用法,在這里確保直接執(zhí)行這個(gè)腳本時(shí)才啟動(dòng)開發(fā)Web 服務(wù)器。如果這個(gè)腳本由其他腳本引入,程序假定父級(jí)腳本會(huì)啟動(dòng)不同的服務(wù)器,因此不會(huì)執(zhí)行app.run()。

1.4完整的程序
示例1.4 hello.py:一個(gè)完整的Flask 程序
from flask import Flask
app = Flask(__name__)

@app.route("/")
def index():
    return "

Hello World!

" @app.route("/user/") def user(name): return "

Hello, %s!

" % name if __name__ == "__main__": app.run(debug=True)
1.4 異常捕獲

使用裝飾器的形式去捕獲指定的錯(cuò)誤碼和異常

@app.errorhandler(404)
def page_not_found(error):
    return    "404"
1.5請(qǐng)求鉤子

為了讓每個(gè)視圖函數(shù)避免編寫重復(fù)功能的代碼,F(xiàn)lask提供了通用設(shè)施的功能,即請(qǐng)求鉤子。
請(qǐng)求鉤子是通過(guò)裝飾器的形式實(shí)現(xiàn),F(xiàn)lask支持如下四種請(qǐng)求鉤子:


before_first_request:注冊(cè)一個(gè)函數(shù),在處理第一個(gè)請(qǐng)求之前運(yùn)行。

before_request:注冊(cè)一個(gè)函數(shù),在每次請(qǐng)求之前運(yùn)行。

after_request:注冊(cè)一個(gè)函數(shù),如果沒有未處理的異常拋出,在每次請(qǐng)求之后運(yùn)行。

teardown_request:注冊(cè)一個(gè)函數(shù),即使有未處理的異常拋出,也在每次請(qǐng)求之后運(yùn)行。

--

2 模板

模板是一個(gè)包含響應(yīng)文本的文件,其中包含用占位變量表示的動(dòng)態(tài)部分,其具體值只在請(qǐng)求的上下文中才能知道。使用真實(shí)值替換變量,再返回最終得到的響應(yīng)字符串,這一過(guò)程稱為渲染。為了渲染模板,F(xiàn)lask 使用了一個(gè)名為Jinja2 的強(qiáng)大模板引擎。

2.1 Jinja2模板引擎

Jinjia2是由python實(shí)現(xiàn)的

是Flask內(nèi)置的模板語(yǔ)言

參照Django設(shè)計(jì)思想設(shè)計(jì)的,跟Django差不多

2.1.1渲染模板

默認(rèn)情況下,F(xiàn)lask 在程序文件夾中的templates 子文件夾中尋找模板。Flask提供的

示例 hello.py : 渲染模板

from flask import Flask, render_template
# ...
@app.route("/")
def index():
    return render_template("index.html")
@app.route("/user/")
def user(name):
    return render_template("user.html", name=name)

示例 templates/index.html:Jinja2 模板

Hello World!

示例

Hello, {{ name }}!

render_template 函數(shù)封裝了該模板引擎
render_template 函數(shù)的第一個(gè)參數(shù)是模板的文件名,后面的參數(shù)都是鍵值對(duì),表示模板中變量對(duì)應(yīng)的真實(shí)值

2.1.2 變量

在模板中使用的{{ name }} 結(jié)構(gòu)表示一個(gè)變量,它是一種特殊的占位符,告訴模
板引擎這個(gè)位置的值從渲染模板時(shí)使用的數(shù)據(jù)中獲取。

可以使用過(guò)濾器修改變量,過(guò)濾器名添加在變量名之后,中間使用豎線分隔。例如,下述模板以首字母大寫形式顯示變量name 的值:

Hello, {{ name|capitalize }}

Jinja2 提供的部分常用過(guò)濾器

表 Jinja2變量過(guò)濾器

過(guò)濾器名 說(shuō)明
safe 渲染值時(shí)不轉(zhuǎn)義
capitalize 把值的首字母轉(zhuǎn)換成大寫,其他字母轉(zhuǎn)換成小寫
lower 把值轉(zhuǎn)換成小寫形式
upper 把值轉(zhuǎn)換成大寫形式
title 把值中每個(gè)單詞的首字母都轉(zhuǎn)換成大寫
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的HTML 標(biāo)簽都刪掉
2.1.3 控制結(jié)構(gòu)

Jinja2 提供了多種控制結(jié)構(gòu),可用來(lái)改變模板的渲染流程。

條件控制:

{% if user %}
    Hello, {{ user }}!
{% else %}
    Hello, Stranger!
{% endif %}

循環(huán)控制:

    {% for comment in comments %}
  • {{ comment }}
  • {% endfor %}


{ % macro render_comment(comment) % }
    
  • {{ comment }}
  • { % endmacro % }
      { % for comment in comments % } {{ render_comment(comment) }} { % endfor % }
    模板代碼復(fù)用

    在模板中,可能會(huì)遇到以下問題

    多個(gè)模板具有完全相同的頂部和底部?jī)?nèi)容

    多個(gè)模板中具有相同的模板代碼內(nèi)容,但是內(nèi)容中部分值不一樣

    多個(gè)模板中具有完全相同的 html 代碼塊內(nèi)容

    像遇到這種情況,可以使用 JinJa2 模板中的 宏、繼承、包含來(lái)進(jìn)行實(shí)現(xiàn)

    模板繼承

    標(biāo)簽定義的內(nèi)容

    {% block   %} {% endblock %}

    模板繼承是為了重用模板中的公共內(nèi)容。一般Web開發(fā)中,繼承主要使用在網(wǎng)站的頂部菜單、底部。這些內(nèi)容可以定義在父模板中,子模板直接繼承,而不需要重復(fù)書寫。

    首先創(chuàng)建一個(gè)名為base.html 的基模板
    
    
        {% block head %}
        {% block title %}{% endblock %} - My Application
        {% endblock %}
    
    
        {% block body %}
        {% endblock %}
    
    

    block 標(biāo)簽定義的元素可在衍生模板中修改。在本例中,我們定義了名為head、title 和
    body 的塊。注意,title 包含在head 中。下面這個(gè)示例是基模板的衍生模板:

    {% extends "base.html" %}
    {% block title %}Index{% endblock %}
    {% block head %}
        {{ super() }}
        
    {% endblock %}
    {% block body %}
    

    Hello, World!

    {% endblock %}

    extends 指令聲明這個(gè)模板衍生自base.html。在extends 指令之后,基模板中的3 個(gè)塊被
    重新定義,模板引擎會(huì)將其插入適當(dāng)?shù)奈恢谩W⒁庑露x的head 塊,在基模板中其內(nèi)容不
    是空的,所以使用super() 獲取原來(lái)的內(nèi)容。

    2.2 Flask-Bootstrap

    Bootstrap(http://getbootstrap.com/)是Twitter 開發(fā)的一個(gè)開源框架,它提供的用戶界面組
    件可用于創(chuàng)建整潔且具有吸引力的網(wǎng)頁(yè),而且這些網(wǎng)頁(yè)還能兼容所有現(xiàn)代Web 瀏覽器。
    Bootstrap 是客戶端框架,因此不會(huì)直接涉及服務(wù)器。服務(wù)器需要做的只是提供引用了
    Bootstrap 層疊樣式表(CSS) 和JavaScript 文件的HTML 響應(yīng), 并在HTML、CSS 和
    JavaScript 代碼中實(shí)例化所需組件。這些操作最理想的執(zhí)行場(chǎng)所就是模板。

    初始化Flask-Bootstrap

    from flask.ext.bootstrap import Bootstrap
    # ...
    bootstrap = Bootstrap(app)

    初始化 Flask-Bootstrap 之后,就可以在程序中使用一個(gè)包含所有 Bootstrap 文件的基模板。這個(gè)模板利用Jinja2的模板繼承機(jī)制,讓程序擴(kuò)展一個(gè)具有基本頁(yè)面結(jié)構(gòu)的基模板,其中就有用來(lái)引入 Bootstrap 的元素。官方教程

    {% extends "bootstrap/base.html" %}
    
    {% block title %}Flasky{% endblock %}
    
    {% block navbar %}
    
    {% endblock %}
    
    {% block content %}
    
    {% endblock %}
    2.3 自定義錯(cuò)誤頁(yè)面

    像常規(guī)路由一樣,F(xiàn)lask 允許程序使用基于模板的自定義錯(cuò)誤頁(yè)面。最常見的錯(cuò)誤代碼有
    兩個(gè):404,客戶端請(qǐng)求未知頁(yè)面或路由時(shí)顯示;500,有未處理的異常時(shí)顯示。

    例 hello.py:自定義錯(cuò)誤頁(yè)面

    @app.errorhandler(404)
    def page_not_found(e):
        return render_template("404.html"), 404
    
    @app.errorhandler(500)
    def internal_server_error(e):
        return render_template("500.html"), 500
    2.4 鏈接

    在模板中直接編寫簡(jiǎn)單路由的 URL 鏈接不難,但對(duì)于包含可變部分的動(dòng)態(tài)路由,在模板中構(gòu)建正確的 URL 就很困難。而且,直接編寫 URL 會(huì)對(duì)代碼中定義的路由產(chǎn)生不必要的依賴關(guān)系。如果重新定義路由,模板中的鏈接可能會(huì)失效。Flask 提供了 url_for() 輔助函數(shù),它可以使用程序 URL 映射中保存的信息生成 URL。

    2.5 靜態(tài)文件

    用靜態(tài)文件,例如 HTML代碼中引用的圖片、JavaScript 源碼文件和 CSS。默認(rèn)設(shè)置下,Flask 在程序根目錄中名為 static 的子目錄中尋找靜態(tài)文件。如果需要,可在static 文件夾中使用子文件夾存放文件。
    如索引圖標(biāo)的位置{{ url_for("static", filename = "favicon.ico") }}

    文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44942.html

    相關(guān)文章

    • Python測(cè)試開發(fā)中Django和Flask框架的區(qū)別

      摘要:在談中框架和框架的區(qū)別之前,我們需要先探討如下幾個(gè)問題。通過(guò)大數(shù)據(jù)統(tǒng)計(jì)分析全球著名的網(wǎng)站對(duì)和這兩個(gè)框架的調(diào)查分析。從全球著名的代碼托管平臺(tái)上的和數(shù)量上分別為,分別為。 在談Python中Django框架和Flask框架的區(qū)別之前,我們需要先探討如下幾個(gè)問題。 一、為什么要使用框架? showImg(https://segmentfault.com/img/remote/14600000...

      B0B0 評(píng)論0 收藏0
    • 手把手教你如何用Crawlab構(gòu)建技術(shù)文章聚合平臺(tái)()

      摘要:上一篇文章手把手教你如何用構(gòu)建技術(shù)文章聚合平臺(tái)一介紹了如何使用搭建的運(yùn)行環(huán)境,并且將與集成,對(duì)掘金進(jìn)行技術(shù)文章的抓取,最后可以查看抓取結(jié)果。本篇文章將繼續(xù)講解如何利用編寫一個(gè)精簡(jiǎn)的聚合平臺(tái),將抓取好的文章內(nèi)容展示出來(lái)。 上一篇文章《手把手教你如何用Crawlab構(gòu)建技術(shù)文章聚合平臺(tái)(一)》介紹了如何使用搭建Crawlab的運(yùn)行環(huán)境,并且將Puppeteer與Crawlab集成,對(duì)掘金、...

      zhunjiee 評(píng)論0 收藏0
    • 用koa開發(fā)一套內(nèi)容管理系統(tǒng)(CMS),支持javascript和typescript雙語(yǔ)言

      摘要:而在國(guó)內(nèi)確實(shí)用的人太少,國(guó)內(nèi)的主流服務(wù)端語(yǔ)言都被霸占。因此,在進(jìn)行調(diào)研和諸多權(quán)衡后,團(tuán)隊(duì)選擇了作為第二支持語(yǔ)言。整體上使用開發(fā),也用了一些的特性,之所以用,是因?yàn)閷?duì)于項(xiàng)目的開發(fā)和維護(hù)有極大的益處。 初衷 lin-cms是我們林間有風(fēng)團(tuán)隊(duì)開源的一款CMS,它采用目前主流的前后端分離的架構(gòu),前端使用vue作為基礎(chǔ)框架,后端選擇了我們團(tuán)隊(duì)大量實(shí)踐使用的flask作為基礎(chǔ)框架。 lin-cms...

      lncwwn 評(píng)論0 收藏0
    • 從零開始用 Flask 搭建一個(gè)網(wǎng)站(

      摘要:從零開始用搭建一個(gè)網(wǎng)站一介紹了如何搭建環(huán)境,以及應(yīng)用基本項(xiàng)目結(jié)構(gòu)。我們要搭建的網(wǎng)站是管理第三方集成的控制臺(tái),類似于。我們先定義一個(gè)用戶模型然后在文件夾下創(chuàng)建一個(gè)文件。 從零開始用 Flask 搭建一個(gè)網(wǎng)站(一) 介紹了如何搭建 Python 環(huán)境,以及 Flask 應(yīng)用基本項(xiàng)目結(jié)構(gòu)。我們要搭建的網(wǎng)站是管理第三方集成的控制臺(tái),類似于 Slack。 本篇主要講解數(shù)據(jù)如何在 Flask 應(yīng)用...

      Coly 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

    最新活動(dòng)
    閱讀需要支付1元查看
    <