一、Flask框架概述
1.Flask与Django的区别
(1)Flask的依赖较小,入门简单,初始较简单,项目加大后依赖加大;Django框架大而全。
(2)Flask是一个轻量级的框架。第三方组件非常齐全。Django是一个重量级的框架。
2. 知识内容
(1)路由和视图
(2)视图内容和模板
(3)数据库
(4)迁移,蓝图,测试
3.Flask核心:
(1)Werkzeug工具箱:专门用来处理请求相关的内容,比如:地址
(2)Jinjia2模块引擎:页面渲染处理
(3)额外的拓展包
4.Web应用程序作用
(1)客户端:能够联网并向服务端请求;
(2)服务端:对客户端的请求做相应;
(3)Web框架:已经封装好的代码,开发者根据业务需求,在指定的位置加上自己的业务逻辑代码,降低开发难度,大大加大开发效率;
二、虚拟环境
1.虚拟环境是什么:
一个特殊的文件夹,里面存放着程序,运行所需要的各种版本的python解释器,和各种框架的版本。
2.虚拟环境的相关操作
3. 安装Flask虚拟环境
pip install flask==0.10.1
4. 查看当前虚拟环境中有那些 拓展
pip freeze
(1)导出虚拟环境中的所有的拓展
pip freeze > requirements.txt
(2)根据requirment.txt
安装虚拟环境
pip install -r requirements.txt
5.在pycharm中使用虚拟环境
三、Hello, world!
1. 示例程序
from flask import Flask
# 1. 从flask中导入Flask类
# 2. 创建flask对象 app = Flask(参数...)
# 参数: (1)__name__: 如果当前文件启动,那么值是__main__,如果从其它模块调用,则值是模块的名字
# (2)static_url_path: 表示静态文件的访问地址
# (3)static_folder: 用来存储静态资源的,默认名字是static
# (4)template_folder: 模本文件夹,默认值为template
app = Flask(__name__)
# 使用app,通过路由绑定一个视图函数。
@app.route("/")
# 视图函数:一定要有返回值
def helloWorld():
return "Hello world, Flask"
# 是否直接使用当前模块运行程序
if __name__ == '__main__':
# 运行app程序
app.run()
2.app的操作
(1)查看路由地址
`app.url_map`
返回路由、请求方式(GET/POST)、OPTONS\HEAD及对应的视图函数
3. 相关配置参数
(1) app.run()
参数1:host,默认值为127.0.0.1(可改为公网IP地址)
参数2:port(端口),默认为5000
参数3:debug,默认为False;
- 如果设置为True,如果在运行过程中修改代码,不需要重新 启动程序,只需修改后Ctrl+S保存即可。
- 运行时,程序不会编译代码,出错后可返回错误信息
4. 动态参数类型
(1)在访问路由的时候指定参数
@app.route("/<类型:变量名>")
# 常见的参数类型
"""
整数:int
小数:float
字符串:path(不写类型,默认为path)
"""
(2)自定义转换器
**·**如果系统提供的int,float等参数类型满足不了需求时,需要自定义
**·**之所以,int,float,path可以接受不同的数据类型,是因为系统已经提供对应的转换器
**·**方法:--1. 定义类,继承自BaseConverter
--2. 重写init方法,根据路由重写
--3. 初始化父类成员变量,还有子类自己的规则
--4. 将转换器类添加到系统默认的转换器列表中
cfrom flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
"""
--1. 定义类,继承自BaseConverter
--2. 重写init方法
--3. 初始化父类成员变量,还有子类自己的规则
--4. 将转换器类添加到系统默认的转换器列表中
"""
# 1. 定义类,继承自BaseConverter
class MyRegexConverter(BaseConverter):
# --2. 重写init方法
def __init__(self, Map, regex):
# 3. 初始化父类成员变量,还有子类自己的规则
super(MyRegexConverter, self).__init__(Map)
self.regex = regex
# --4. 将转换器类添加到系统默认的转换器列表中
app.url_map.converters["data"] = MyRegexConverter
# 使用data('规则'),实际上传递了两个参数:1. app.url_map, 2. 括号中的规则
@app.route('/<data("\d{4}"):number>')
def test(number):
return "The number is %s" % number
if __name__ == '__main__':
app.run(debug=True)
lass MyRegexConverter(BaseConverter):
四、设置请求
1.给路由增加访问方式
(1)格式:
@app.route('路径', methods=["method1", "method2", ...])
(2)常见的请求方式
· GET, POST, DELETE