Flask介绍
Flask是一个用Python编写的Web应用程序框架。 它由Armin Ronacher开发,他领导着一个名为Pocco的Python爱好者的国际组织。 Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。
WSGI
Web服务器网关接口(WSGI)已被采纳为Python Web应用程序开发的标准。 WSGI是Web服务器和Web应用程序之间通用接口的规范。
WERKZEUG
它是一个WSGI工具包,它实现了请求,响应对象和其他实用程序功能。 这可以在其上构建Web框架。 Flask框架使用Werkzeug作为其一个基础模块之一。
浅谈Django、Flask和Tornado区别?
- Django:简单的说Django是一个大而全的Web框架,内置了很多组件,ORM、admin、Form、
ModelForm、中间件、信号和缓存等。基于wsgi协议部署的,使用wsgiref模块实现此协议;
- Flask:微型的小而精的Web框架,可扩展性强,内置的组件很少,需要引入第三方组件实现功能业务,如果开发简单的项目,使用Flask比较快速和方便。如果开发大型项目,需要引入大量的第三方组件,这时Flask会越来越像Django框架。基于wsgi协议部署,使用werkzeug模块实现此协议,模板系统由 Jinja2提
供。 - Tornado:是一个轻量级的Web框架,可扩展性强,用于快速开发简单程序,用于强大的异步非阻塞
和内置WebSocket功能。
Flask快速入门
安装
在创建项目之前我们需要安装Flask,当然在这之前应该创建虚拟环境,在虚拟环境中安装Flask,在这里就不多说:
1 | pip install Flask |
基本使用
1 | from flask import Flask |
参数介绍:
flask(import_name, static_url_path, template_folder, instance_path, instance_relative_config, root_path, static_folder)
- import_name:要创建的app的名称
- static_url_path:用来指定url路径中
static
代表的路径,可以看作别名,类似Django中的STATICFILES_DIRS
配置,static用来存放静态文件,默认为static
- static_folder:指定静态文件的存放目录,默认为
static
- template_folder:指定模板文件的存放目录,默认为
templates
- root_path:应用搜索
static、templates
等目录的根目录,也就是说,会在root_path
指定的目录下搜索static、templates
文件夹- 如果你没有指定
root_path
,那么Flask就会将import_name
所在的目录作为root_oath
- 如果你没有指定
- instance_relative_config:这个参数只在为app生成配置的时候有用,app在生成Config的时候,
make_config
传递进入的是root_path
还是在实例化app
时指定的instance_path
- instance_path:当
instance_relative_config=True
的时候该参数才有效 ,如果instance_path=None(默认)
,默认搜索配置文件的路径就是root_path
下的instance/
目录
配置文件
flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为 :
1 | { |
如果需要修改配置,可以根据下面的方式修改:
方式一
app.config[DEBUG]=True
注意:由于Config对象本质上是字典,可以使用app.config.update(…)
方式二
app.config.form_pyfile(‘python文件名称’)
如:settings.py
1
DEBUG = True
app.config.from_pyfile(‘settings.py’)
方式三
app.config.form_envvar(‘环境变量名称’)
环境变量的值为python文件名称,内部调用form_pyfile方法
方式四
app.config.form_json(‘json文件名称’)
json文件必须是json格式,内部会执行json.loads
方式五
app.config.from_mapping({‘DEBUG’:True})
方式六(推荐使用)
app.config.from_object(‘python类或类的路径’) #默认从根目录开始
- settings.py文件
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
27
28
29
30
31
32
33
34class Config(object):
"""应用程序配置类"""
# 开启调试模式
DEBUG = True
# logging等级
LOGGIONG_LEVEL = logging.DEBUG
# flask-sqlalchemy使用的参数
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@127.0.0.1:3306/ehome'
# 追踪数据库的修改行为,如果不设置会报警告,不影响代码的执行
SQLALCHEMY_TRACK_MODIFICATIONS = True
# 显示sql语句
# SQLALCHEMY_ECHO = True
class DevelopConfig(Config):
"""开发阶段下的配置子类"""
# logging等级
LOGGIONG_LEVEL = logging.DEBUG
class UnitTestConfig(Config):
"""单元测试配置子类"""
# logging等级
LOGGIONG_LEVEL = logging.DEBUG
SQLALCHEMY_DATABASE_URI = 'mysql://root:root@127.0.0.1:3306/ehome_test'
class ProductionConfig(Config):
"""生产环境下配置子类"""
# logging等级
LOGGIONG_LEVEL = logging.WARNING
DEBUG = False
SQLALCHEMY_DATABASE_URI = 'mysql://root:root@47.106.93.190:3306127.0.0.1:3306/ehome'注意:settings.py文件默认路径要放在程序root_path目录,如果instance_relative_config为
True
,则就是instance_path目录
路由系统
1 | # @app.route('/user/<username>') |
以上五种路由是最常用的,下面再来了解一下路由的执行过程:
1 |
|
当执行app.route(‘/‘,methods=[‘GET’,’POST’],endpoint=’hello’)时会执行如下代码:
1
2
3
4
5
6
7
8
9def route(self, rule, **options):
# self 是app对象
# rule = '/'
# options = {methods=['GET','POST'], endpoint='hello'}
def decorator(f):
endpoint = options.pop('endpoint', None)
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator实质就是decorator = app.route(‘/‘,methods=[‘GET’,’POST’],endpoint=’hello’)
有返回值后,实际上就是@decorator,这次执行decorator函数会把index函数当做参数传入
我们这里写的路由其实就是执行了app.add_url_rule(‘/‘, ‘hello’, index, methods=[‘GET’,’POST‘])这句代码,这就跟django框架一样了
在来看看 @app.route和app.add_url_rule常用参数(只是部分):
rule:URL规则
view_func:视图函数名称
defaults=None:默认值,当URL中无参数,函数需要参数时,使用defaults={‘k’:’v’}为函数提供参数
endpoint=None:名称,用于反向生成URL,即: url_for(‘名称’)
methods=None:允许的请求方式,如:[‘GET’,’POST’]
strict_slashes=None:对URL最后的 / 符号是否严格要求
redirect_to=None:重定向到指定地址,如下:
1
2
3
4
5@app.route('/index/<int:nid>', redirect_to='/home/<nid>')
或
def func(adapter, nid):
return "/home/888"
@app.route('/index/<int:nid>', redirect_to=func)
所有的路由系统都是基于一下对应关系来处理 :
1 | DEFAULT_CONVERTERS = { |
注意:此配置在werkzeug包下routing.py文件中
以上的路由其实已经够用了,但是不排除有一些比较另类的,这时可以考虑自定制正则路由匹配
1 | from flask import Flask, views, url_for |
请求和响应
请求相关信息
1 | # request.method |
响应相关信息
1 | # return '字符串' |