Flask 學習(二)路由

Flask  路由

  

  在說明什麼是 Flask 路由以前,詳細闡述下 Flask 「Hello World」 這一 最小應用的代碼。chrome

 

  Flask 「Hello World」

 1 from flask import Flask
 2 
 3 app  =  Flask(__name__)
 4 
 5 @app.route('/')
 6 def hello():
 7     return 'Hello World'
 8 
 9 if __name__ = '__main__':
10     app.run()

    剖析上述代碼:flask

    1. 首先,咱們導入了類 Flask 。這個類的實例化將會是咱們的 WSGI 應用。第一個參數是應用模塊的名稱。 若是你使用的是單一的模塊(就如本例),第一個參數應該使用 __name__。由於取決於若是它以單獨應用啓動或做爲模塊導入, 名稱將會不一樣 ( '__main__' 對應於實際導入的名稱)。api

    2. 接着,咱們建立一個該類的實例。咱們傳遞給它模塊或包的名稱。這樣 Flask 纔會知道去哪裏尋找模板、靜態文件等等。
    3. 以後,咱們使用裝飾器 route() 告訴 Flask 哪一個 URL 才能觸發咱們的函數。這也就是路由,博文以後會詳細學習。
    4. 以後 ,定義一個函數,該函數名也是用來給特定函數生成 URLs,而且返回咱們想要顯示在用戶瀏覽器上的信息。
    5. 最後,咱們用函數 run() 啓動本地服務器來運行咱們的應用。if __name__ == '__main__': 確保服務器只會在該腳本被 Python 解釋器直接執行的時候纔會運行,而不是做爲模塊導入的時候。瀏覽器

    服務器外部可見:安全

      目前服務器 僅可本機 localhost 訪問,這是由於默認狀況下,調試模式,應用中的一個用戶能夠執行你計算機上的任意 Python 代碼。服務器

      若是你關閉 debug 或者信任你所在網絡上的用戶,你可讓你的服務器對外可用,只要簡單地改變方法 run() 的調用像以下這樣:網絡

       app.run(host='0.0.0.0')  這讓你的操做系統去監聽全部公開的 IP。app

  

   調試模式函數

    有兩種方式開啓調式模式:加入語句,應用對象上設置標誌位:   app.debug = True  工具

                或者做爲 run 的一個參數傳入:   app.run(debug=True)   做爲 run 的一個參數傳入

    調試模式有安全隱患,決不可在生產環境使用,參考以下:

Attention

Even though the interactive debugger does not work in forking environments (which makes it nearly impossible to use on production servers), it still allows the execution of arbitrary code. This makes it a major security risk and therefore it must never be used on production machines.

      打開調試模式下,若網頁出錯,示例顯示如:

 

  Flask 路由

      所謂 路由,即 URL 綁定; Flask 使用 route() 裝飾器把一個函數綁於一個URL上, 以下:

 1 from flask import Flask
 2 app  =  Flask(__name__)
 3 
 4 @app.route('/')
 5 def indexPage():
 6     return 'Index Page'
 7     
 8 @app.route('/flask')
 9 def flaskPage():
10     return 'Flask Page'
11 
12 if __name__ == '__main__':
13     app.run()

      如上示例,把 "/" url 綁了indexPage() 函數,把"/flask" url 綁了flaskPage() 函數。

  HTTP請求模擬工具:這邊須要使用到HTTP請求工具來查看,chrome可用插件postman;firefox可用HttpRequest。具體使用這邊就不介紹了,很簡單。

      運行後,請求url   以及 

    

      以上僅是最簡單的url構造,你能夠動態地構造 URL 的特定部分,也能夠在一個函數上附加多個規則。以後會具體介紹。

   變量規則

      給 URL 增長變量的部分,把一些特定的字段標記成 <variable_name>。這些特定的字段將做爲參數傳入到你的函數中。

      固然也能夠指定一個可選的轉換器經過規則 <converter:variable_name>。

      先看如下示例(以後示例均省略上下文代碼):

@app.route('/user/<username>')
def show_user_profiile(username):
    # show the user profile for that user
    return 'User: {0}'.format(username)

      即簡單的URL增長變量,運行後請求的URL需帶參數 

 

      存在以下轉換器: ,示例代碼以下:

@app.route('/userid/<int:user_id>')
def show_userId(user_id):
    # show the user_id, the id  is an integer
    return 'User ID: {0}'.format(user_id)

      URL 須在 "/userid/" 後傳遞一個整數,運行後如

    HTTP 方法

      默認狀況,建立的URL路由是Get方法,可在經過給 route() 裝飾器提供 methods 參數來改變 HTTP 方法,有關HTTP協議相關,請Google相關文檔。

@app.route("/postUser", methods=["POST"])
def hello_user():
    return "Post User"

      上述示例即爲一 Post 方法的路由,運行後直接訪問會報405,由於該請求方式 應爲 Post,這邊使用 FireFox 插件 HttpRequester 來模擬

      

      更改成 Post 方式,

      最經常使用的方式即 Post 和 Get,其餘的還有 Delete、Put 等,需用時請閱相關的文檔。

   

  Request 參數

    需要引入request   from flask import Flask, request  ,來進行request參數的傳值,具體示例以下:

@app.route("/query_user")
def query_user():
    userId = request.args.get("id")
    return "query user: {0}".format(userId)

         有沒有很熟悉? 再看下多參數的,以下例:

@app.route("/query_page")
def query_page():
    pageid    = request.args.get("pageid")
    num       = request.args.get("num")
    return "query page: {0} and {1}".format(pageid,num)

         (該部分僅簡單介紹,後續會具體學習)

 

  URL 構建

    根據函數名反向生成url。可使用函數 url_for() 來針對一個特定的函數構建一個 URL。它可以接受函數名做爲第一參數,以及一些關鍵字參數, 每個關鍵字參數對應於 URL 規則的變量部分。未知變量部分被插入到 URL 中做爲查詢參數。

    需要引入 url_for, from flask import Flask, request, url_for   路由的構建爲以前的示例  (這裏使用了 test_request_context() 方法,以後章節會給出解釋。這邊只要瞭解這個方法是告訴 Flask 表現得像是在處理一個請求便可。)

@app.route('/')
def indexPage():
    return 'Index Page'
    
@app.route("/query_user")
def query_user():
    id = request.args.get("id")
    return "query user: {0}".format(id)
    
with app.test_request_context():
    print url_for('indexPage')
    print url_for('query_user',id=100)

        (該部分僅簡單介紹,後續會具體學習)


    URL的構建在實際項目中比較經常使用,爲何你願意構建 URLs 而不是在模版中硬編碼?這裏有三個好的理由:

      · 反向構建一般比硬編碼更具有描述性。更重要的是,它容許你一次性修改 URL, 而不是處處找 URL 修改。      · 構建 URL 可以顯式地處理特殊字符和 Unicode 轉義,所以你沒必要去處理這些。      · 若是你的應用不在 URL 根目錄下(好比,在 /myapplication 而不在 /), url_for() 將會適當地替你處理好。

相關文章
相關標籤/搜索