中文文档(http://docs.jinkan.org/docs/flask/)
英文文档(http://flask.pocoo.org/docs/0.11/)
postman
回顾HTTP通信
历史
Flask诞生于2010年,是Armin ronacher(人名)用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。它主要面向需求简单的小应用。
Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验证等。Flask没有默认使用的数据库,你可以选择MySQL,也可以用NoSQL。其 WSGI 工具箱采用 Werkzeug(路由模块) ,模板引擎则使用 Jinja2 。
可以说Flask框架的核心就是Werkzeug和Jinja2
。
Python最出名的框架要数Django,此外还有Flask、Tornado等框架。虽然Flask不是最出名的框架,但是Flask应该算是最灵活的框架之一,这也是Flask受到广大开发者喜爱的原因。
01-flask安装配置
虚拟环境是一个互相隔离的目录
mkvirtualenv flask_py2
pip install flask==0.10.1
pip freeze>requirements.txt
pip install -r requirements.txt
flask第一个 Hello World
# coding:utf-8
# 导入 Flask 类
from flask import Flask
# 创建一个flask的应用对象
# __name__ 表示当前的模块名字
# 模块名,flask以这个模块所在的目录为总目录,默认这个目录中的static为静态目录,templates为模版目录
app = Flask(__name__)
# app = Flask("__main_") # 直接当成启动文件的模式
@app.route("/") #装饰器
def index():
"""定义视图函数"""
return "Hello Flask"
if __name__ == '__main__':
app.run()
02-app对象的初始化和配置
目录
|-flask_project
|—static
|—templates
|—app.py
|—demo.py
flask应用对象初始化参数说明
"""
import name; #导入路径(寻找静态目录与模版目录位置的参数)
static_url_path # 访问静态资源的url前缀,默认static
static_folder # 静态文件的目录,默认 static
template_folder # 模版文件目录,默认是templates
"""
Flask(__name__, # __name__ 就是当前模块的名字
static_url_path="/static", # 默认值是static
static_folder="static",
template_folder="templates"
)
静态文件目录与路由说明
/static/ index.html
将 static 目录摘取出来,默认访问静态资源了就;
约定成熟的!
url.py
flask 设置 - 配置参数
-
3 直接操作 config
app.config['DEBUG'] = TRUE
flask中的配置参数不是在一个单独的文件中设置的,而是在app.config中保存的
app.config的操作与对字典的操作相同,可以通过[]运算符直接设置其中的内容,还可以通过get取出其中的内容之前在启动程序的时候,如果设置debug=True的参数,就可以打开调试模式,如果不在启动的时候给出debug参数,也可以在app.config中设置DEBUG,同样可以打开调试模式。本次就以这个参数为例,演示一下flask的配置参数的方法
from flask import Flask app = Flask(__name__) # 通过直接操作app.config字典,来完成配置参数 # 这并不是一个好的配置参数的方法,仅供参考 app.config["DEBUG"] = True @app.route("/") def index(): return "<h1>hello world</h1>" if __name__ == "__main__": app.run()
-
1 使用配置文件读取配置文件
app.config.from_pyfile()
通过app.config.from_pyfile(),指定配置文件,可以完成参数配置
首先,创建一个settings.py文件,settings.py中的代码如下
DEBUG = Truefrom flask import Flask app = Flask(__name__) app.config.from_pyfile("./settings.py")
-
2 通过对象配置参数(项目中的方式)
app.config.from_object()
定义一个配置参数的类对象,然后从中读取配置信息
从对象中读取文件的方法:app.config.from_object()
具体的使用代码如下from flask import Flask app = Flask(__name__) class FlaskConfig: DEBUG = True app.config.from_object(FlaskConfig)
-
4 使用环境变量读取配置文件
同上一个方法一样,仍然是通过配置文件完成配置信息,但是不同的地方在于配置文件的名字没有被直接写在代码中,而是通过系统的环境变量读取的
环境变量名设置为:任意,例如FLASK_SETTING
读取环境变量使用:app.config.from_envvar(环境变量名的字符串)
例如,在linux的系统中,通过如下的方式设置环境变量名# 环境变量的设置,用于linux系统,windows系统可通过相似的方法完成设置 export FLASK_SETTING="./settings.py"
然后在代码中,按照如下方式使用
from flask import Flask app = Flask(__name__) app.config.from_envvar("FLASK_SETTING")
补充:从环境变量中读取配置文件的分析
在python中,通过内置的os模块,可以读取到环境变量,因此从环境变量中读取配置文件,和直接读取配置文件其实是一样的,以上代码相当于from flask import Flask import os app = Flask(__name__) # 通过os模块,从os.environ中读取到FLASK_SETTING的配置文件路径 flask_setting = os.environ.get("FLASK_SETTING") # 通过刚刚读取到的配置文件的路径,通过from_pyfile配置文件 app.config.from_pyfile(flask_setting)
读取 - 配置参数
视图中使用配置参数?
- 1.直接从全局对象app的config字典中取值
app.config.get() - 2.current_app
from flask import Flask,current_app
current_app.config.get()
app的run使用说明
Flask app.run的执行流程
在使用app.run执行的时候我们不是再本地跑或者说我们不想使用127.0.0.1的方式来执行。那我们应该怎么执行呢?
‘’’
1.host:要监听的主机名。 默认为127.0.0.1(localhost)。设置为“0.0.0.0”以使服务器在外部可用
2.port:默认值为5000
3.debug:默认为false。 如果设置为true,则提供调试信息
4.options:要转发到底层的Werkzeug服务器
‘’’
app.run(host=‘0.0.0.0’,port=5000,debug=True)
03-视图函数的路由
使用route() 装饰器来告诉 Flask 触发函数的 URL
路由转换器
视图函数的路由规则设置说明
-
查看全部路由信息
app.url_map 查看所有路由
-
给路由指定访问方式
通过 methods 限定访问方式, 接受参数形式为列表
# 通过method限定访问方式 @app.route('/post_only', methods=['POST', 'GET']) def post_only(): return 'post'
-
反解析 url_for()和redirect()
使用 url_for() 的函数,可以通过 视图函数的名字 找到视图对应的 url 路径
而 redirect() 函数则是 url 重定向,会再次发送一个新的请求。
从 flask 库中导入这两个函数,一般这两个函数会一起使用。
切记
: url_for() 接收的是 视图函数的名称,返回的是对应的 url 路径,切勿把 url 路径传进去。
案例:
from flask import Flask,current_app,redirect,url_for
# 创建flask应用对象
# __name__表示当前的模块名字
# 模块名,flask以整个模块所在的目录为总目录,默认整个目录中的static为静态目录
# templates为模板目录
app = Flask(__name__)
@app.route("/")
def index():
"""
定义的视图函数
:return:
"""
print(app.url_map)
return "hello flask"
@app.route("/post_only",methods=["POST"])
def post_only():
return "post only page"
@app.route("/hello",methods=["POST"])
def hello():
return "hello 1"
@app.route("/hello",methods=["GET"])
def hello2():
return "hello 2"
# 多个路由绑定同一视图函数
@app.route("/hi1")
@app.route("/hi2")
def hi():
return "hi page"
@app.route("/login")
def login():
# 使用url_for函数,通过视图函数的名字,找到视图对应的url路径
url = url_for("index")
return redirect(url)
@app.route("/register")
def register():
url = "/"
return redirect(url)
if __name__ == '__main__':
# 通过url_map可以查看整个flask中路由信息
print(app.url_map)
app.run(debug=True)
路由提取参数与自定义路由转换器
路由转换器: 有时我们需要将同一类URL映射到同一个视图函数处理
比如:使用同一个视图函数 来显示不同用户的个人信息。
注意 转换器的使用格式为:<转换器类型:参数名称>
Flask内置转换器
转换器 | 描述 |
---|---|
int | 接受整数 |
float | 同int,但是接受浮点数 |
path | 和默认的相似,但也接受斜线 |
- [ X ] 字符串转换器
注意:视图函数里接受的参数必须和route
捕获尖括号<>
里的参数一致
# str转换器 不加转换器类型, 默认是普通字符串规则(除了/的字符)
@app.route('/user/<username>')
def user_str(username):
response = 'hello {}'.format(username)
return response
- [ X ] 整型转换器
# int转换器
@app.route('/user/<int:user_id>')
def user_int(user_id):
response =