Flask 路由

轉載自:https://www.cnblogs.com/feeland/p/4593325.html

 

  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()

 

    剖析上述代碼:

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

    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.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() 將會適當地替你處理好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章