flask学习笔记(2)——Flask设置配置项、视图函数绑定多路由及自定义装饰器的使用

[toc]

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

hello01

刷新当前页面
hello02

再次刷新当前页面

hello03

以此类推,没刷新一次页面访问页面次数就加1。

好啦,以上就是今天分享的全部内容了,其实学web开发挺有意思的(手动吃瓜~)