一、 Flask理论简要介绍
Flask 基于Python语言编写的轻量级Web应用框架,凭借更灵活、轻便、安全且易上手的特性,成为奇特常用的Pyhton框架之一
Flask基于Python开发且依赖jinja2模板(用于:控制前端) 和 Werkzeug WSGI服务(控制函数路由)的一个微型框架,其中,Werkzeug WSGI服务
本质上Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给
用户,如果要返回给用户复杂的内容时,需要借助jinja2模板l来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器
框架特点:
1、 Flask自由、灵活、可扩展性强,第三方库的选择面广开发时可以结合自己喜欢的轮子,也能结合最流行最强大的python库
2、 入门简单,拥有python基础,即使没有多少web开发经验,也会很快做出网站
3、 适用于中小型网站
4、 适用于开发Web服务的API
5、 开发大型网站无压力,但代码架构需要自己设计,开发成本取决于开发者的能力和经验
二、Flask两大核心
1 Werkzeug
实现路由、调试和Web服务器网关接口 ; 是一个遵循WSGI协议的python函数库
-- WSGI : Web Server Gateway Interface
-- 其内部实现了很多web框架底层的东西,比如:request和response对象
-- 与WSGI规范的兼容,支持Unicode
-- 支持最基本的会话管理和签名Cookies
-- 集成URL请求路由等
Werkzeug库和routing模板负责实现URL解析
不同的URL对应不同的视图函数,routing模块会对请求信息的URL进行解析,匹配到URL对应的视图函数,执行该函数以此生成一个响应信息
routing模块内部有: Rule类用来构造不同的URL模式的对象,路由由URL规则
2 Jinja2
实现了模板
三、 Flask架构模式–MTV VS MVC
1、架构模式
1) MVC介绍
M --- Model,数据模型,负责数据的存取
V --- View,视图,负责页面的展示逻辑
C --- Controller,控制器,负责业务逻辑的处理
2) MTV介绍
M --- Model,数据模型,负责业务对象与数据库的对象(ORM)
Flask- PyMongo/Flask-MongoKit
Flask- SQLAlchemy
T --- Template,模板,负责将数据展示给用户
Jinja2
V ---View,视图,负责业务逻辑,并在使用的时候调用:Model和Template
Flask-WTF/bootstrap-flask/Flask-Uploads
四、 Flask与Django对比
1、相似之处
1) 都是Python Web开发框架
能够使用python在服务端创建web应用,并使用html和css作为前端,或者使用其它任何前端框架
2) 可以使用ORM或对象关系映射
可以使用:SQLITE、MYSQL、PostgreSQL 和其它领用ORM框架
--- Django默认使用ORM
--- Flask默认情况下不具备ORM功能,需要时可手动添加它
3) 模板
--- Djangp使用类似于Jinja的引擎(实际上,Jinja的灵感来源于Django自己的模板系统)
--- Flask使用Jinja作为模板引擎
--- Jinja基本上就像HTML的Python( python+html=Jinja),它能够向HTML添加逻辑,例如:if/else for循环等
2、不同之处
1) Flask
-- 轻量级, 被称作Micro Framework,在网站设计放面Flask各方面性能均等于或优于Django
-- Django自带的或第三方好评如潮的功能,Flask上总会找到与之类似第三方库Flask灵活开发
-- Python高手基本都会喜欢Flask, 但对Django却可能褒贬不一
-- Flask与关系型数据库的配合使用不弱于Django,而与其NoSQL数据库的配合远远优于Django
-- Flask比Django更加Pthonic, 与python的philosophy
2) Django
-- Django太重,除了web框架,自带ORM和模板引擎,灵活和自由度不高
-- Django能开发小应用, 但总会有“杀鸡焉用牛刀”
-- Django的自带ORM非常优秀,综合评价略高于SQLAIchemy
-- Django自带的模板引擎简单好用,但其强大程度和综合评价略低于Jinja
-- Django自带ORM也使Djangp与关系型数据库耦合度过高,如果想使用MongoDB等NOSQL数据库,需要选取合适的第三方库,
其实:Django+SQL结合最搭配
-- Django目前支持Jinja等非官方模板引擎
-- Django自带的数据库管理app好评如潮
-- Django非常适合企业级网站的开发: 快速、靠谱、稳定Django成熟、稳定、完善,但相比于Flask, Django的整体生态
相对封闭
-- Django是Python Web框架的先驱,用户多,第三方库最丰富,最好的Python库,如果不能直接用到Django中,也一定能找
到与之对应的移植
-- Django上手也比较容易,开发文档详细、完善,相关资料丰富
五、一个简单的Flask应用
首先安装: pip install flask
from flask import Flask
# 创建一个Flask实例
app = Flask(__name__)
@app.route("/")
def index():
# url对应的函数
return "Hello World"
if __name__ == "__main__":
# 由python内置服务器nginx调配
# 这个不是作为模块导入的时候运行,比如这个文件为aa.py,当python aa.py就执行这个代码。如果是在其它文件import的话,不执行这个文件
# 运行Flask的应用(启动Flask服务),默认会开启5000的端口提供测试访问
# 如需调试,将app.run()改为app.run(debug=True)即可,这样每次修改之后,不需要每次都重启服务器
app.run(debug=True)
终端运行结果:
1、 查看已安装的Flask版本
--- 检验是否已安装, 进入python解释器中,输入: import flask 后回车,如果无反应代表未安装
--- 检查flask版本, python解释器中,输入:flask.__version__
2、在线安装flask
-- sudo pip3 install flask / pip install flask
3、导入使用
from flask import Flask
# 当前运行的主程序构建成Flask应用,以便接收用户的请求(request) 并给出响应
六、Flask项目开始开启
1、Flask简洁目录结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9OzXW4lj-1666406358287)(…/flask_notes_pictures/Flask目录结构.png)]
2、 Flask环境配置
社区版额Pycharm需要自己手动创建flask简单的框架结构
专业版的pycharm可以直接New Project选择项目类型,如下图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZdXJoB4l-1666406358288)(…/flask_notes_pictures/pycharm_Flask环境设置.png)]
运行项目时,需要切入虚拟环境中,项目运行命令:默认直接运行app.py(否则需要指定运行文件)-powershell
环境变量设置时,需处于项目目录下
1) $env: FLASK_APP="app" # 设置环境变量
2) $env: FLASK_ENV ="development" # 开启调试模式
3) flask run --host=127.0.0.1 --port=3882 --with-thread
3、配置与访问
项目结构介绍:
-- 项目名
|--- static (js/css)静态
|--- templates(模板)(html)
|--- app.py(运行/启动)
windows命令行终端-运行Flask项目:
1) set FLASK_APP=app.py(你需要运行的py文件)
2) flask run(成功后即可访问网址)
run(host="ip地址",port="端口号")
静态配置:
app.config['ENV'] = 'development' # 默认production 生产
1) 激活调试器
2) 激活自动重载
3) 打开Flask应用的调试模式
app.config['debug'] = True
PS终端命令强制配置: $Env:FLASK_ENV = 'development'
setting.py存在配置:
ENV = 'development'
DEBUG = True
app.config.from_object(settings) # app.py中加载配置变量
PS控制台:
进入虚拟环境目录下: cd 虚拟环境Script目录下
激活并使用虚拟环境: .\activate
4、 路由的变量规则
注:路由就是为了匹配用户请求地址以及对应的视图函数
@app.route("/index") ---》app.add_url("/index",view_func=index) #路由不以装饰器形式时使用,
这个装饰器其实就是通过add_url_rule将rule字符串跟视图函数进行绑定
路由变量规则(“/”表示整个网关的根路径)
1) 在URL中添加变量
@app.route("/getcity/<key>")
2) 加类型转换器,为变量指定规则
@app.route("/add/<int:num>")
@app.route("/path/<path:subpath>")
转换器类型有:String\int\float\path\uuid
3) 唯一的URL “/” 重定向行为:
@app.route("/index") 和 @app.route("/index/")区别 ---- 前者不包含后者,但后者包含前者
路由规则中可以传递多个参数,对于flask来说,所有视图函数都必须有返回值,否则当参数不符合if条件时会报错
return返回值类型
返回值: 其实就是Response响应对象font color= "red" >Hello Word
1)、 加前端样式
return < font color="red">Hello World!<font>
2)、 字符串
3)、 Response对象
@app.route('/getcity/<string:city>')
def getcity_all(city): # put application's code here
"""单参数"""
# 返回Response对象
return Response(data.get(city))
4) 字典
return {"a": "北京", "b": "上海", "c": "西安"}
5) 元组
return a,b,c
Flask之request对象
request.headers
request.path
request.full_path
request.url
视图函数与模板结合–渲染模板
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JOgfTXqt-1666406358290)(…/flask_notes_pictures/视图函数与模板结合_模板渲染.png)]
流程图: 根据路由规则表找到匹配的函数--->执行函数---》 rener_template()方法---》模板引擎i寻找templates的register.html---->
转换成字符串形式---》 通过视图函数的return将字符串返回---》给客户端浏览器
疑问: 默认去模板文件夹中找文件夹的,怎么知道文件夹就是templates???
答复:因为app=Flask(__name__)
Flask自动为你配置Jinja2模板引擎
使用render_template()方法可以渲染模板,只要提供模板名称和需要作为参数传递给模板的变量
模板的渲染
1) 作用: 在视图中,将模板文件西安渲染成字符串,再响应给客户端浏览器
2)函数:
from flask import render_template
str = render_tempalte(‘模板名称.html’)
获取页面提交的内容
前端:
- 点击submit默认执行action动作
- 如果是表单提交必须再表单的元素上添加name属性
后端:
- request.full_path
- request.path
注意:
模板路由中注明请求方式: @app.route('/introduce/<string:nickname>/<int:age>/', methods=['GET', 'POST'])
Get请求 ----args: dict类型
requst.args : 所有参数数据---返回字典
request.args.get('参数名称')
Post请求--form 输出结果同上
request.form
request.form.get('参数名称')
修改配置
app.run(debug=True, port=5000,
template_folder="", # 存放模板文件夹名
static_folder="", # 存放静态文件文件夹名
static_url_path="") # 静态文件访问路径