anonymous的flask學習筆記(2)——Flask設置配置項、視圖函數綁定多路由及自定義裝飾器的使用

Flask設置配置項、視圖函數綁定多路由及自定義裝飾器的使用

Flask設置配置項

可以通過app.config['key值'] = value值來修改以下默認配置參數

default_config = ImmutableDict(
        {
            "ENV": None,
            "DEBUG": None,
            "TESTING": False,
            "PROPAGATE_EXCEPTIONS": None,
            "PRESERVE_CONTEXT_ON_EXCEPTION": None,
            "SECRET_KEY": None,
            "PERMANENT_SESSION_LIFETIME": timedelta(days=31),
            "USE_X_SENDFILE": False,
            "SERVER_NAME": None,
            "APPLICATION_ROOT": "/",
            "SESSION_COOKIE_NAME": "session",
            "SESSION_COOKIE_DOMAIN": None,
            "SESSION_COOKIE_PATH": None,
            "SESSION_COOKIE_HTTPONLY": True,
            "SESSION_COOKIE_SECURE": False,
            "SESSION_COOKIE_SAMESITE": None,
            "SESSION_REFRESH_EACH_REQUEST": True,
            "MAX_CONTENT_LENGTH": None,
            "SEND_FILE_MAX_AGE_DEFAULT": timedelta(hours=12),
            "TRAP_BAD_REQUEST_ERRORS": None,
            "TRAP_HTTP_EXCEPTIONS": False,
            "EXPLAIN_TEMPLATE_LOADING": False,
            "PREFERRED_URL_SCHEME": "http",
            "JSON_AS_ASCII": True,
            "JSON_SORT_KEYS": True,
            "JSONIFY_PRETTYPRINT_REGULAR": False,
            "JSONIFY_MIMETYPE": "application/json",
            "TEMPLATES_AUTO_RELOAD": None,
            "MAX_COOKIE_SIZE": 4093,
        }
    )

比如設置當前application運行環境爲開發環境(默認是生產環境)

# 設置配置項
# 設置開啓debug模式
app.config['DEBUG'] = True
# 設置啓用服務器的端口
app.config['PORT'] = 12306
# 設置application的當前運行環境爲開發環境,默認不設置的時候爲生產環境
app.config['ENV'] = 'development'

未設置application的當前運行環境爲開發環境前,啓動服務控制檯輸出如下

* Running on http://127.0.0.1:12306/ (Press CTRL+C to quit)
* Restarting with stat
* Serving Flask app "flask02" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Debugger is active!
* Debugger PIN: 740-975-992

設置application的當前運行環境爲開發環境後,啓動服務控制檯輸出如下

* Running on http://127.0.0.1:12306/ (Press CTRL+C to quit)
* Restarting with stat
* Serving Flask app "flask02" (lazy loading)
* Environment: development
* Debug mode: on
* Debugger is active!
* Debugger PIN: 740-975-992

對比一下上邊的兩次控制檯輸出,可以看出使用默認生產環境開運行flask服務時,會提示:這是一個開發服務器。不要在生產部署中使用它。請改用生產WSGI服務器。

相對於flask,生產服務器可以選用uWSGINginx

  • uWSGI:uWSGI是一個Web服務器,它實現了WSGI協議、uwsgi、http等協議。
    • WSGI / uwsgi / uWSGI 這三個概念的區分
      • WSGI是一種通信協議。Web服務器網關接口(Python Web Server Gateway Interface,縮寫爲WSGI)是爲Python語言定義的Web服務器和Web應用程序或框架之間的一種簡單而通用的接口。
      • uwsgi是一種線路協議而不是通信協議,在此常用於在uWSGI服務器與其他網絡服務器的數據通信。
      • 而uWSGI是實現了uwsgi和WSGI兩種協議的Web服務器。
  • Nginx:Nginx(engine x)是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。
    • Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特點是佔有內存少,併發能力強,事實上nginx的併發能力在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。

Flask視圖函數綁定多路由

有時候我們需要設置訪問多個url路徑返回的頁面數據後端處理邏輯都一致,這時候就可以通過視圖函數綁定多路由來實現。

示例

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

此時運行flask服務,分別訪問http://127.0.0.1:12306/, http://127.0.0.1:12306/index, http://127.0.0.1:12306/helloWorld, 前端頁面展示的效果都相同,都是helloWorld

自定義裝飾器的使用

有時候我們需要統計某個URL路由的訪問次數,就可以通過設置自定義裝飾器來實現。

示例

#!/usr/bin/python3
# @FileName    :flask02.py
# @Time        :2020/5/31 下午9:55
# @Author      :ABC
# @Description :
import time
from flask import Flask

app = Flask(__name__)


# 打印當前時間的裝飾器
def log_time(f):
    def decorator(*args, **kwargs):
        print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
        return f(*args, **kwargs)  # 不要return其他的值,否則會被作爲response返回

    return decorator


# 打印當前時間的裝飾器
def log_time1(f):
    def decorator1(*args, **kwargs):
        app.config['num'] += 1
        return f(*args, **kwargs)  # 不要return其他的值,否則會被作爲response返回

    return decorator1


# 一個視圖函數上可以同時綁定多個url路由規則
# 如果還有其它裝飾器該怎麼處理?
# 1.視圖裝飾器應該放在最外層(比如下邊的`@log_time`),否則裏邊的裝飾器不會生效 2.視圖函數包裹的裝飾器不要return新值,否則會被包裝成返回數據返回
# 常用視圖函數來統計某個url路由的訪問量或記錄時間日誌
@app.route("/index")
@app.route("/helloWorld")
@app.route("/")
@log_time
def index():
    return "helloWorld"


@app.route("/hello")
@log_time1
def index():
    return "你好,我叫小花花!這是你第{}次訪問本頁面!".format(app.config.get('num'))


# 設置配置項
# 設置開啓debug模式
app.config['DEBUG'] = True
# 設置啓用服務器的端口
app.config['PORT'] = 12306
# 設置application的環境爲開發環境,默認不設置的時候爲生產環境
app.config['ENV'] = 'development'
# 統計某個url路由的訪問次數
app.config['num'] = 0

if __name__ == '__main__':
    app.run(port=app.config.get('PORT'), debug=app.config.get('DEBUG'))

然後啓用flask服務,前端訪問http://127.0.0.1:12306/hello 多次,每訪問一次,app.config['num']就加1,然後前端頁面返回本次是第n次訪問本頁面。

效果如下

第一次訪問http://127.0.0.1:12306/hello
在這裏插入圖片描述

刷新當前頁面
在這裏插入圖片描述

再次刷新當前頁面
在這裏插入圖片描述

以此類推,沒刷新一次頁面訪問頁面次數就加1。

好啦,以上就是今天分享的全部內容了,其實學web開發挺有意思的(手動喫瓜~)

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