flask简介

Flask是使用Python编写的Web微框架。Web框架可以让我们不用关心底层的请求响应处理,更方便高效地编写Web程序。因为Flask核心简单且易于扩展,所以被称作微框架(micro framework)。Flask有两个主要依赖,一个是WSGI(Web Server Gateway Interface,Web服务器网关接口)工具集——Werkzeug(http://werkzeug.pocoo.org/),另一个是Jinja2模板引擎(http://jinja.pocoo.org/)。Flask只保留了Web开发的核心功能,其他的功能都由外部扩展来实现,比如数据库集成、表单认证、文件上传等。如果没有合适的扩展,你甚至可以自己动手开发。Flask不会替你做决定,也不会限制你的选择。总之,Flask可以变成任何你想要的东西,一切都由你做主。

官方文档:https://dormousehole.readthedocs.io/en/latest/

简单的demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from flask import Flask

"""
传入Flask类构造方法的第一个参数是模块或包的名称,我们应该使用特殊变量__name__。
Python会根据所处的模块来赋予__name__变量相应的值,对于我们的程序来说(app.py),这个值为app。
除此之外,这也会帮助Flask在相应的文件夹里找到需要的资源,比如模板和静态文件。
static_url_path:静态文件访问路劲,可以不传,默认:/ + static
static_folder:静态文件存储的文件夹,可以不传,默认为:static
template_folder:模板文件存储的文件夹,可以不传,默认:templates
"""
app = Flask(__name__, static_url_path="", static_folder="", template_folder="")


"""
app.route()装饰器把根地址/和index()函数绑定起来,当用户访问这个URL时就会触发index()函数。
这个视图函数可以像其他普通函数一样执行任意操作,比如从数据库中获取信息,获取请求信息,对用户输入的数据进行计算和处理等。
最后,视图函数返回的值将作为响应的主体,一般来说,响应的主体就是呈现在浏览器窗口的HTML页面
"""
@app.route('/')
def hello_world():
return 'Hello World!'


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

  • flask run 启动服务
  • flask run--host=0.0.0.0 指定运行的host
  • flask run--port=8000 指定运行的端口
  • flask shell Python Shell可以执行exit()或quit()退出,在Windows系统上可以使用Ctrl+Z并按Enter退出;在Linux和macOS则可以使用Ctrl+D退出。

创建管理环境变量的文件

Tip: There are .env or .flaskenv files present. Do "pip install python-dotenv" to use them.

项目根目录下分别创建两个文件:.env和.flaskenv。.flaskenv用来存储和Flask相关的公开环境变量,比如FLASK_APP;而.env用来存储包含敏感信息的环境变量,比如后面我们会用来配置Email服务器的账户名与密码。在.flaskenv或.env文件中,环境变量使用键值对的形式定义,每行一个,以#开头的为注释

1
2
# 开发环境
FLASK_ENV=development

注意:.env包含敏感信息,除非是私有项目,否则绝对不能提交到Git仓库中。当你开发一个新项目时,记得把它的名称添加到.gitignore文件中

安装检测文件变化的模块

pip install watchdog

引入orm的包

install flask-sqlalchemy

配置信息

Flask将配置信息保存到了app.config属性中,该属性如下所示:

1
2
3
4
5
6
<Config {'ENV': 'development', 'DEBUG': True, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': None,
'PERMANENT_SESSION_LIFETIME': datetime.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_S
AMESITE': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(seconds=43200), 'TRAP_B
AD_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}>

获取配置信息的方式

  • app.config.get(name)
  • app.config[name]

设置配置信息

app.config.from_obj(配置的对象)

1
2
3
4
class Config(object):
KEY = "2312312WEDQDQWD"
app = Flask(__name__)
app.config.from_object(Config)

继承配置:

1
2
3
4
5
class BaseConfig(object):
SECRET_KEY = os.getenv('SECRET_KEY', 'dev key')

class DevelopmentConfig(BaseConfig):
SQLALCHEMY_DATABASE_URI = prefix + os.path.join(basedir, 'data-dev.db')

app.config.from_pyfile(配置文件)

1
2
app = Flask(__name__)
app.config.from_pyfile('setting.py')

app.config.from_envvar(环境变量名)

工厂模式加载flask对象:

1
2
3
4
def create_flask_app(config):
app = Flask(__name__)
app.config.配置
return app