跳至主要內容

最小的服务

Mr.Liu大约 4 分钟

最小的服务

Flask

django是大而全,提供所有常用的功能 flask是小而精,只提供核心功能

环境配置

  • 命令直接安装: pip install flask==1.1.2
  • 使用环境依赖文件 requirements.txt,提供命令 pip install -r requirements.txt

基本流程

  • 创建flaskAPP
  • 定义视图函数
  • 使用装饰器,配置路由
  • 直接运行APP
from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello():
    return "hello Flask"


if __name__ == '__main__':
    app.run()

项目配置

配置对象

  • 提供config对象直接设置即可,适用于 少量的配置项
import os

from flask import Flask

app = Flask(__name__)

app.config['DEBUG'] = True


@app.route('/')
def hello():
    return "hello Flask"


if __name__ == '__main__':
    app.run()

配置文件

通过专门的配置文件,读取配置项,适用于配置项较多

config.py

class Config(object):
    DEBUG = True

主模块

import os
from flask import Flask

app = Flask(__name__)

app.config.from_object('config.Config')


@app.route('/')
def hello():
    return "hello Flask"


if __name__ == '__main__':
    app.run()

from_objectfrom_pyfile的区别

  • from_object 接受的是一个模块对象,需求import config导入;
    • 先创建config.py
    • 从主模块中导入
import  config
app = Flask(__name__)
app.config.from_object('config')
  • from_pyfile接受的是一个文件名,文件可以是.py文件也可以是.txt文件等等;
app = Flask(__name__)
app.config.from_pyfile("config.py",silent=True)

# silent=True表示如果配置文件不存在的时候不抛出异常,默认是为False,会抛出异常。

环境变量

通过环境变量导入, 有些配置项和电脑环境有关系,需要从电脑读取,不能写死

import os

from flask import Flask

app = Flask(__name__)

app.config['DEBUG'] = os.getenv('DEBUG') if os.getenv('DEBUG') else True


@app.route('/')
def hello():
    return "hello Flask"


if __name__ == '__main__':
    app.run()

路由映射

指明请求方法

Web 应用使用不同的 HTTP 方法处理 URL 。当你使用 Flask 时,应当熟悉 HTTP 方法。 缺省情况下,一个路由只回应 GET 请求。 可以使用 route()open in new window 装饰器的 methods 参数来处理不同的 HTTP 方法:

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()

如果当前使用了 GET 方法, Flask 会自动添加 HEAD 方法支持,并且同时还会 按照 HTTP RFCopen in new window 来处理 HEAD 请求。同样, OPTIONS 也会自动实现。

唯一的 URL / 重定向行为

以下两条规则的不同之处在于是否使用尾部的斜杠。

@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'

projects 的 URL 是中规中矩的,尾部有一个斜杠,看起来就如同一个文件夹。 访问一个没有斜杠结尾的 URL 时 Flask 会自动进行重定向,帮你在尾部加上一个斜杠。

about 的 URL 没有尾部斜杠,因此其行为表现与一个文件类似。如果访问这个 URL 时添加了尾部斜杠就会得到一个 404 错误。这样可以保持 URL 唯一,并帮助 搜索引擎避免重复索引同一页面。

查看所有路由映射

from flask import Flask

app = Flask(__name__)


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


@app.route('/post_only', methods=["POST"])
def post_only():
    return "post only page"


if __name__ == '__main__':
    # 通过url_map可以查看整个flask中的路由信息
    print(app.url_map)
    # 启动flask程序
    app.run(debug=True)

项目启动

命令行启动

注意: flaskAPP所在的文件,应该是 app.py

$ ls
 app.py      config.py

$ flask run -h 0.0.0.0 -p 7000 # 指定网络ip和端口号
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://192.168.0.105:7000/ (Press CTRL+C to quit)

代码运行

import os

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello():
    return "hello Flask"


if __name__ == '__main__':
    # app.run(host='0.0.0.0', port=7000, debug=True)
    Flask.run(self=app, host='0.0.0.0', port=7000, debug=True)

工厂模式

如果在一个函数中 创建对象,那么就可以创建多个实例。

那么这样做有什么用呢?

  1. 用于测试。可以针对不同的情况使用不同的配置来测试应用。
  2. 用于多实例,如果你需要运行同一个应用的不同版本的话。当然你可以在服务器上 使用不同配置运行多个相同应用,但是如果使用应用工厂,那么你可以只使用一个 应用进程而得到多个应用实例,这样更容易操控。

app/__init__.py

from flask import Flask


def create_app(config_file_name=''):
    app = Flask(__name__)
    app.config.from_pyfile(config_file_name, silent=True)

    return app

主模块

from app import create_app

app = create_app()


@app.route('/')
def hello():
    return "hello Flask"


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=7000, debug=True)