Flask框架
Flask介绍
- Flask的核心在于Werkzeug(路由模块), Jinja2模板引擎
- 类比Django:路由、模板、ORM
- Flask要完成功能,依赖于丰富的插件(扩展模块)
- 常问问题:Django与Flask有什么区别
在谈Python中Django框架和Flask框架的区别之前,我们需要先探讨如下几个问题:
- 为什么要使用框架?
为了更好地阐述这个问题,我们把开发一个应用的过程进行类比,往往开发一个应用(web应用、系统应用)跟建造房子的过程一样,需要先打地基,搭好骨架,然后一块砖一块砖叠上去。
而开发一个应用呢?同样也需要一个好的架构设计,数据库建模,然后一个模块一个模块使用代码实现。
如果开发一个软件应用不使用框架,和我们建房子时,每一块砖、每一根钢筋都需要自己生产出来本质上是一样的。
显而易见,如果在建造房子之前,每一块砖头、每一种建材,都需要我们自己去生产的话,建造房子的效率是极低的,
甚至可能一辈子也无法把房子建造好。
在开发应用系统时,使用框架可以带来如下好处:
— 大大提升开发效率
— 让应用开发更加规范、拓展性更强
— 让程序员把更多的精力放在业务逻辑的实现上,而不是重复、而复杂的基础环境上(比如web服务器、底层实现等)
- 为什么使用Django和Flask框架?
在Python编程语言的世界里,功能最强大、最流行的两个框架。
不仅在web后端开发、微服务开发,同时在ERP系统开发、API接口开发等领域,这两个框架应用非常广泛。
- Django和Flask的区别
形象类比
如果Django类似于精装修的房子,自带豪华家具、非常齐全功能强大的家电,什么都有了,拎包入住即可,十分方便。
而Flask类似于毛坯房,自己想把房子装修成什么样自己找材料,买家具自己装。材料和家具种类非常丰富,并且都是现成免费的,直接拿过去用即可。
在体量上的区别
Flask:
- 小巧、灵活,让程序员自己决定定制哪些功能,非常适用于小型网站。
- 对于普通的工人来说将毛坯房装修为城市综合体还是很麻烦的,使用Flask来开发大型网站也一样,开发的难度较大,代码架构需要自己设计,开发成本取决于开发者的能力和经验。
Django:
- 大而全,功能极其强大,是Python web框架的先驱,用户多,第三方库极其丰富。
- 非常适合企业级网站的开发,但是对于小型的微服务来说,总有“杀鸡焉有宰牛刀”的感觉,体量较大,非常臃肿,定制化程度没有Flask高,也没有Flask那么灵活。
完成同样一个Hello World功能
使用Flask来完成:
- 第一步,安装Flask,pip install flask
- 第二步,创建my_first_app.py文件,添加如下代码
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello Word' if __name__ == '__main__': app.run(host='127.0.0.1',port=8888,debug=True)
完成最简单的Hello World功能,Flask只需要7行代码,非常简单、方便。
使用Django来完成:
- 第一步,安装Django,pip install django
- 第二步,创建工程项目目录,django-admin startproject myproject
- 第三步,创建子应用,python manage.py startapp myapp
- 第四步,在myapp应用所在目录中的views.py文件中,添加如下代码
from django.http import HttpResponse def index(request): return HttpResponse("Hello Word")
- 第五步,在myapp应用所在目录中创建urls.py路由文件,并添加如下代码
from django.conf.urls import url from . import views urlpatterns = [ url(r'^$',views.index,name='index') ]
- 第六步,在主路由文件中添加路由。
从上面的操作步骤可知,实现同样的一个功能,往往Flask较为简单,代码较少,而Django所涉及到的流程较多,工程项目结构清晰,在大型项目中具有优势。
- 在实际工作中如何选择这两个框架呢?
如果你想搞懂Python web开发WSGI协议原理以及实现过程、或者你想灵活定制组件,完全DIY你的应用、想实现微服务,那么建议你选择Flask。
如果你关注产品的最终交付、想快速开发一个大的应用系统(比如新闻类网站、商城、ERP等),那么建议你选择Django,你想得到的功能它都有,想不到的功能它也有。
- 如何才能学好框架呢?
需要先学习框架的基础知识、基本实现原理。
结合项目实践,提升编码能力和业务逻辑的理解。
翻看框架源码,深入理解源码精髓。(进阶)
环境搭建
virtualenvwrapper 来创建、管理我们的虚拟环境
开发中,我们一个项目是要对应应虚拟环境的
- 安装 虚拟环境
pip install virtualenvwrapper-win
- 配置虚拟环境主目录
在windows上环境变量中 添加 环境变量 WORKON_HOME
配置上目录 D:\virtual_envs
- 虚拟环境操作
创建虚拟环境
mkvirtualenv 虚拟环境名
查看所有虚拟环境
workon
激活(切换)虚拟环境
workon 虚拟环境名 C:\Users\沐沐>workon jiyun (jiyun) C:\Users\沐沐> deactivate
查看命令是否在虚拟环境中,要看 命令行的前缀是否有括号(虚拟环境名)
移除虚拟环境
rmvirtualenv 虚拟环境名
退出虚拟环境
deactivate
- 安装Flask
pip install flask==1.0.2
- pip高级使用
导出环境中所有的包
pip freeze > C:\Users\沐沐\Desktop\requirements.txt
在环境中批量安装包(终端)
(newenv) C:\Users\沐沐>cd Desktop (newenv) C:\Users\沐沐\Desktop>pip install -r requirments.txt
实现Flask入门应用
# 实现步骤: # 1.导入Flask类 from flask import Flask # 2.实例化Flask对象 app = Flask(__name__) # 3.编写路由与视图 @app.route('/') def index(): return 'Hello Flask' # 4.启动服务 if __name__ == '__main__': app.run()
# 知识点抽取: 1.实例化Flask对象: app = Flask(__name__) 1).__name__参数用于确定启动程序的位置 2).__name__参数可以传递除了标准模块名的任意字符串, 但不推荐 3).__name__参数如果传递标准模块名, 不影响路由的匹配, 但会影响静态文件的加载 2.@app.route('/'): 路由配置 @app.route('路由')是以装饰器的形式构建路由的, 其第一个参数为路由路径 3.app.run(): Flask实例的方法, 用于启动web服务, 可选参数如下: - host: 服务启动的IP地址 - port: 服务启动的端口 - debug: 是否以调试模式启动 示例: app.run(host='127.0.0.1', port=8899, debug=True)
Flask项目配置
# Flask项目配置文件加载方式: 1.从配置对象中加载 2.从配置文件中加载 3.从环境变量中加载
- Flask配置理解
app.config 是一个类字典的对象,里面已经有了很多默认的配置。我们可以向里面添加自己新的配置
向配置中添加配置
# 配置信息 print(app.config) app.config["ROOM"] = "407" app.config["MYSQL_HOST"] = "127.0.0.1"
从配置中获取配置变量对应的值
# 获取配置中的信息 print(app.config["ROOM"]) print(app.config["MYSQL_HOST"])
- 配置对象加载
实现步骤: - 创建配置类(建议单独文件中创建) - 加载配置对象 - 使用配置
示例:
settings.py代码: # 定义一个配置类 # 属性 必须是 全大写 class Config: # 配置 属性=值 ROOM = "407" MYSQL_HOST = "127.0.0.1"
Flask实例文件(app.py)代码: from flask import Flask # 导入配置类 from settings import Config def create_app(config): app = Flask(__name__) # 从对象加载配置 app.config.from_object(config) return app # 获取配置信息 # get方式调用配置 print(app.config.get("ROOM")) print(app.config.get("MYSQL_HOST")) # 字典键值方式调用配置 print(app.config['ROOM']) print(app.config['MYSQL_HOST'])
- 配置文件加载—我们直接把配置信息 写入到文件中,然后去加载
实现步骤: - 创建配置文件(py文件或其他格式文件均可) - 加载配置文件 - 使用配置
示例:
settings.py代码: ROOM = "3308" MYSQL_HOST = "192.168.0.54"
Flask实例文件(app.py)代码: from flask import Flask app = Flask(__name__) # 从文件加载配置 app.config.from_pyfile('settings.py') # 获取配置信息 print(app.config['ROOM']) print(app.config['MYSQL_HOST']) print(app.config.get("ROOM")) print(app.config.get("MYSQL_HOST")) if __name__ == '__main__': app.run()
- 环境变量中加载
实现步骤: - 创建配置文件(存放敏感信息, 不与项目同目录) - 添加配置文件环境变量 - 获取配置
我们在pycharm中定义一个环境变量,这个环境变量指向一个目录下的文件
我在桌面上创建一个a.txt文件 写入如下内容:
ROOM="999" MYSQL_HOST="99.88.89.11"
在pycharm中定义一个环境变量 aaa 指向 a.txt文件,如下图:
在flask中使用 这个环境变量aaa,代码如下:
app.py代码: app = Flask(__name__) app.config.from_object(Config) app.config.from_pyfile("settings.py") app.config.from_envvar("aaa") print(app.config.get("ROOM")) print(app.config.get("MYSQL_HOST"))
- 三种配置方式对比:
从对象加载配置: 配置方式灵活, 可复用性强, 但不安全
从文件加载配置: 复用性不好, 也不安全, 但是官方推荐用法
从环境变量加载: 相对安全, 利于配置敏感信息, 推荐使用
扩展1:
为什么要安装虚拟环境?
虚拟环境可以让系统Python环境保持纯洁,干净,避免包的混乱和版本的冲突。专为不同的项目搭建不同的环境,为每个项目使用虚拟环境可以保证项目只访问虚拟环境中的包,从而保持全局解释器的干净整洁,使其只作为创建虚拟环境的源.
扩展2:
我们要把自己项目给 其他人,我们需要给什么?
代码+依赖库(requirments.txt)