教程内容大纲
参考视频教程:https://www.bilibili.com/video/BV1Lf4y117PS
中文文档:http://docs.jinkan.org/docs/flask/
英文文档:https://flask.palletsprojects.com/en/2.3.x/
第一部分:路由和视图
1. Flask简介
- 作者:Armin Ronacher
- 诞生时间:2010年
- 组成:Werkzueg+Jinja2+额外扩展包
- werkzueg:专门用来处理请求相关的内容,如:地址。
- Jinja2:用来做页面渲染处理的。
- 额外的扩展包:可以做数据库的连接、站点管理、数据库迁移、缓存处理(flask-cache)等,常用的flask扩展包模块如下:
- Flask-SQLalchemy:操作数据库;
- Flask-script:插入脚本;
- Flask-migrate:管理迁移数据库;
- Flask-Session:Session存储方式指定;
- Flask-WTF:表单;
- Flask-Mail:邮件;
- Flask-Bable:提供国际化和本地化支持、翻译;
- Flask-Login:认证用户状态;
- Flask-OpenID:认证;
- Flask-RESTful:开发REST API工具;
- Flask-Bootstrap:集成前端Twitter Bootstrap框架;
- Flask-Moment:本地化时间和日期;
- Flask-Admin:简单而可扩展的管理接口的框架。
- 更多扩展参考:http://flask.pocoo.org/extensions/
2. 虚拟环境
- 什么是虚拟环境?
- 它就是一个特殊的文件夹,里面存放着程序运行所需要的各种版本的Python解释器和各种版本的框架。
- 虚拟环境的安装和操作命令(Ubantu环境)
- 先查看操作系统中是否有虚拟环境?
virtualenv -version
- 如果查看之后没有虚拟环境的命令,则安装:(需联网)
pip install virtualenv pip install virtualenvwrapper
- 查看当前操作系统中有哪些虚拟环境的文件夹?
workon
- 创建虚拟环境文件夹(需联网)
# 该命令安装好之后,默认的Python解释器是Python2.x mkvirtualenv 文件夹名字 # 指定安装Python3.x的解释器 mkvirtualenv -p python3 虚拟环境文件夹名
- 从虚拟环境中退出
deactivate [虚拟环境文件夹名]
- 进入到虚拟环境中
workon 虚拟环境名称
- 删除虚拟环境
rmvirtualenv 虚拟环境名称
- 安装flask框架
pip install flask==0.10.1
- 查看当前虚拟环境中有哪些扩展
pip freeze
- 导出虚拟环境中用到的所有扩展
pip freeze > requirements.txt
- 安装requirements.txt文件中的扩展
pip install -r requirements.txt
- 先查看操作系统中是否有虚拟环境?
- 虚拟环境的安装和操作命令(Windows系统)
# 1. 安装虚拟环境 pip install virtualenvwrapper-win # 2. 检查是否安装成功 workon # 出现如下提示表示安装成功: # C:\Users\Administrator>workon# Pass a name to activate one of the following virtualenvs: # ============================================================================== # 找不到文件 # 3. 创建虚拟环境 virtualenv 虚拟环境名 # 4. 删除虚拟环境 rmvirtualenv 虚拟环境名称 # 5. 安装指定版本的flask框架 pip install flask==0.10.1 # 6. 查看已安装的扩展 pip freeze # 7. 退出虚拟环境 deactivate 虚拟环境名称 # 8. 进入虚拟环境 workon 虚拟环境名称 # 9. 导出虚拟环境中的所有扩展 pip freeze > requirements.txt
3. helloworld程序
# 1. 从flask模块中导入Flask类
from flask import Flask
# 2. 创建Flask对象
# 参数1:__name__,如果从当前文件启动,那么值是__main__,如果是从其他模块调用运行的那么值是模块的名字
# 参数2:static_url_path,表示静态资源(如css文件、js文件、图片等)的访问地址,/static
# 参数3:static_folder,用来存储静态资源的,默认名字是static,需要创建一个static文件夹
# 参数4:template_folder,模板文件夹,特指一些html文件,默认的值是templates,需创建一个templates文件夹
app = Flask(__name__) # Ctrl+P查看方法中的参数 # app是application的简写
print(__name__) # __main__
print(app.static_url_path) # /static
print(app.static_folder) # D:\Python_project\Flask\test1\static
print(app.template_folder) # templates
# 使用app,通过路由绑定一个视图函数
# 注意点:视图函数一定要有返回值。(此返回结果是给浏览器的)
@app.route('/')
def hello_world():
return "hello world Flask"
# 判断是否直接使用当前模块运行程序
if __name__ == "__main__":
# 运行app程序 访问地址是:http://127.0.0.1:5000
app.run()
4. 配置信息(app,环境变量)
app.run()参数
- 参数1:host,如果我们不指定,默认值是127.0.0.1。
- 参数2:port,如果我们不指定,默认值是5000。
- 参数3:debug,调试模式,如果不指定,默认值是False。
- 如果设置为True,有两个好处:
-
- 如果在运行过程中,直接改动代码了,就不需要重新启动程序,只要Ctrl+S保存即可部署程序。
-
- 如果程序报错了,会有友情提示。
from flask import Flask
app = Flask(__name__)
@app.route('/hh')
def index():
print(1/0)
return "<h2>this is index</h2>"
if __name__ == "__main__":
app.run(host="127.0.0.1", port=5000, debug=True)
5. 路由信息(路径、参数、请求方式)
1. 在访问路由的时候指定参数
- 格式:@app.route(“/<类型:变量名>”)
- 常见的类型:
-
- 整数:int
-
- 小数:float
-
- 字符串:path(默认就是path)
"""
在访问路由的时候指定参数
- 格式:@app.route("/<类型:变量名>")
- 常见的参数类型
- 整数 int
- 小数 float
- 字符串 path 默认就是path
"""""
from flask import Flask
app = Flask(__name__)
# 接收一个整数
@app.route('/<int:num>')
def get_intnumber(num):
return "the age is %s" % num
# 接收一个小数
@app.route('/<float:num>')
def get_floatnumber(num):
return "the float is %s" % num
# 接收一个字符串
@app.route('/<path:str1>')
def get_pathnumber1(str1):
return "the path is %s" % str1
# 接收一个字符串
@app.route('/<str1>')
def get_pathnumber2(str1):
return "the path is %s" % str1
if __name__ == "__main__":
app.run(debug=True)
2. 自定义参数类型(自定义转换器)
- 应用情况:
- 如果系统提供的int、flost、path等参数满足不了需求的时候,我们需要自定义。
- 之所以int、float、path可以接收不同的数据类型,是因为系统已经提供好对应的转换器了。
- 自定义转换器的格式:
-
- 定义类,继承自BaseConverter。
-
- 重写init方法,接收来两个参数。
-
- 初始化父类成员变量,还有子类自己的规则。
-
- 将转换器类,添加到系统默认的转换器列表中。
-
"""
- 自定义转换器的格式:
- 1. 定义类,继承自BaseConverter。
- 2. 重写init方法。
- 3. 初始化父类成员变量,还有子类自己的规则。
- 4. 将转换器类,添加到系统默认的转换器列表中。
需求:只接收3位整数
"""""
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# - 1. 定义类,继承自BaseConverter。
class MyRegexConverter(BaseConverter):
# 下面这样直接指定匹配规则,不够灵活,具体匹配什么规则应该交给路由
# regex = "\d{3}" # 仅匹配3位整数
# - 2. 重写init方法。接收两个参数
def __init__(self, map, regex):
# - 3. 初始化父类成员变量,还有子类自己的规则。
super(MyRegexConverter, self).__init__(map)
self.regex = regex
# - 4. 将转换器类,添加到系统默认的转换器列表中。
app.url_map.converters["haha"] = MyRegexConverter
# 匹配三位整数
# 使用haha(‘规则’),实际上是传递了两个参数,参数1:app.url_map,参数2:括号中写的正则表达式
@app.route('/<haha("\d{3}"):number>')
def get_three_number(number):
return "the three number is %s" % number
# 匹配四位整数
@app.route('/<haha("\d{4}"):number>')
def get_four_number(number):
return "the four number is %s" % number
# 匹配一个手机号
@app.route('/<haha("1[3-9]\d{9}"):phone>')
def get_phone_number(phone):
return "the phone is %s" % phone
if __name__ == "__main__":
app.run(debug=True)
6. 响应信息(json、redirect、url_for、状态码)
1. 直接返回响应体数据
- return ‘字符串’
2. 直接返回响应体数据+状态码
- return ‘字符串’, 状态码
3. 直接返回响应体数据+状态码+响应头信息
- return ‘字符串’, 状态码, {‘key’: ‘value’}