环境安装
- 环境安装
- 1. 复习虚拟环境和pip的命令
- 2. 创建虚拟环境
- 3. 安装Flask
- HelloWorld程序
- 1 目标
- 2 思考
- 3 Flask程序编写
- 4 启动运行
- 参数说明
- 1 Flask对象初始化参数
- 默认参数情况下
- 修改参数的情况下
- 2 应用程序配置参数
- 作用
- 使用方式
- 读取
- 设置
- 项目中的常用方式
- 3 app.run 参数(作为了解)
- 开发服务器运行方式
- 1 终端启动
- 说明
- 扩展
- 2 Pycharm启动
- 笔记
环境安装
1. 复习虚拟环境和pip的命令
这几个命令要记好
# 虚拟环境
mkvirtualenv # 创建虚拟环境
rmvirtualenv # 删除虚拟环境
workon # 进入虚拟环境、查看所有虚拟环境
deactivate # 退出虚拟环境
# pip
pip install # 安装依赖包
pip uninstall # 卸载依赖包
pip list # 查看已安装的依赖包
pip freeze # 冻结当前环境的依赖包
2. 创建虚拟环境
创建虚拟环境要联网
mkvirtualenv flask -p python3
注意需要联网
3. 安装Flask
使用flask 1.0.2版本,注意需要联网
下面指令将安装最新版本的
pip install flask
HelloWorld程序
1 目标
掌握flask程序的编写方式
2 思考
回忆如何起步编写Django程序?
flask没有约束文件结构
3 Flask程序编写
下面这个程序就是一个flask应用
创建helloworld.py文件
创建出对象完成视图,路由,请求,响应的管理
# 导入Flask类
from flask import Flask
#Flask类接收一个参数__name__
app = Flask(__name__)
# 装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
return 'Hello World'
# Flask应用程序实例的run方法启动WEB服务器
if __name__ == '__main__':
app.run()
4 启动运行
- 手动运行
python helloworld.py
- pycharm 运行
像正常运行普通python程序一样即可。
参数说明
- Flask对象的初始化参数
- 应用程序配置参数
- app.run()运行参数
1 Flask对象初始化参数
Flask 程序实例在创建的时候,需要默认传入当前 Flask 程序所指定的包(模块),接下来就来详细查看一下 Flask 应用程序在创建的时候一些需要我们关注的参数:
- import_name
- Flask程序所在的包(模块),传 name 就可以
- 其可以决定 Flask 在访问静态文件时查找的路径
- 填写__name__将会把入口文件所在直接目录作为查找静态资源的起点
- 传递一个字符串
- static_url_path
- 静态文件访问路径,可以不传,默认为:/ static_folder
- static_folder
- 静态文件存储的文件夹,可以不传,默认为 static
- template_folder
- 模板文件存储的文件夹,可以不传,默认为 templates
- Flask(“django”) 会将这个模块所在的目录当做主目录
- 可以访问静态资源
- static_url_path
比如传入 /s 访问 /s/1.png 也能访问到静态资源 - 后两个参数填写绝对路径和相对路径都可以,当前目录在项目主目录下
默认参数情况下
app = Flask(__name__)
文件目录
----
|---static
| |--- 1.png
|---helloworld.py
访问 127.0.0.1:5000/static/1.png 就可以访问到图片
修改参数的情况下
app = Flask(__name__, static_url_path='/url_path_param', static_folder='folder_param')
文件目录
----
|---folder_param # 此处目录名变化
| |--- 1.png
|---helloworld.py
访问127.0.0.1:5000/url_path_param/1.png才可以访问到图片
2 应用程序配置参数
对于Flask对象初始化参数仅仅设置的是Flask本身的属性,比如:
- Flask从哪里读取静态文件
- Flask从哪里读取模板文件
- …
等等。
应用程序配置参数设置的是一个Web应用工程的相关信息,比如:
- 数据库的连接信息
- 日志的配置信息
- 自定义的配置信息
- …
等等
作用
集中管理项目的所有配置信息
使用方式
Django将所有配置信息都放到了settings.py文件中,而Flask则不同。
Flask将配置信息保存到了app.config属性中,该属性可以按照字典类型进行操作。但是该字典以方括号取值的时候不会报错
读取
- app.config.get(name)
- app.config[name]
设置
主要使用以下三种方式:
- 从配置对象中加载
app.config.from_object(配置对象)
class DefaultConfig(object):
"""默认配置,可以写好多类属性,加载后将会以键值对的方式进行存储到app中"""
SECRET_KEY = 'TPmi4aLWRbyVq8zu9v82dWYW1'
app = Flask(__name__)
app.config.from_object(DefaultConfig)
@app.route("/")
def index():
print(app.config['SECRET_KEY'])
return "hello world"
应用场景:
作为默认配置写在程序代码中
可以继承
class DevelopmentConfig(DefaultConfig):
DEBUG=True
- 从配置文件中加载
app.config.from_pyfile(配置文件)
新建一个配置文件setting.py
SECRET_KEY = 'TPmi4aLWRbyVq8zu9v82dWYW1'
在Flask程序文件中
app = Flask(__name__)
app.config.from_pyfile('setting.py')
@app.route("/")
def index():
print(app.config['SECRET_KEY'])
return "hello world"
应用场景:
在项目中使用固定的配置文件
- 从环境变量中加载
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。 环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。
通俗的理解,环境变量就是我们设置在操作系统中,由操作系统代为保存的变量值
在Linux系统中设置和读取环境变量的方式如下:
习惯上环境变量大写
在终端设置的环境变量只在当前终端中有效,pycharm每次运行都会开启一个新的终端,所以之前的环境变量对本次运行不会有效
export 变量名=变量值 # 设置
echo $变量名 # 读取
# 例如
export ITCAST=python
echo $ITCAST
Flask使用环境变量加载配置的本质是通过环境变量值找到配置文件,再读取配置文件的信息,其使用方式为
app.config.from_envvar('环境变量名')
环境变量的值为配置文件的绝对路径
先在终端中执行如下命令
export PROJECT_SETTING='~/setting.py'
再运行如下代码
这段代码是到PROJECT_SETTING指向的文件去找配置信息,会以项目主目录为出发点去寻找文件
app = Flask(__name__)
app.config.from_envvar('PROJECT_SETTING', silent=True)
@app.route("/")
def index():
print(app.config['SECRET_KEY'])
return "hello world"
关于silent
的说明:
表示系统环境变量中没有设置相应值时是否抛出异常
- False 表示不安静的处理,没有值时报错通知,默认为False
- True 表示安静的处理,即时没有值也让Flask正常的运行下去
Pycharm运行时设置环境变量的方式
也可以直接在输入框中添加
pycharm 在执行前会添加这些环境变量
应用场景:
配置文件的地址不固定;
在代码中不想暴露真实的配置文件地址,只在运行代码的服务器上才有真实配置文件的信息。
项目中的常用方式
从配置对象中加载:
优点: 有继承,方便添加或修改属性
缺点:敏感数据会暴露在代码当中,比如秘钥,可能会被窃取,造成数据泄露
应用场景:写默认配置,为了保留字段,值可以随便写
从配置文件中加载:
优点:独立文件保护敏感数据,可以写个绝对路径,将配置文件放到代码之外
缺点:放到不同机器上的时候,可能需要改代码
不考虑灵活性,只考虑保密,可以使用配置文件+绝对路径的方式
使用环境变量:
优点:设置环境变量,可以不用修改代码,指定环境变量
缺点:记得设置环境变量
应该使用配置对象加载默认配置,保证没有设置此配置的时候也不会报错,在环境变量中指明配置文件的路径,在配置文件中写真实敏感信息
第二次加载如果有默认配置,会进行覆盖
常使用工厂模式创建Flask app,并结合使用配置对象与环境变量加载配置
DEBUG 可以控制项目运行在调试模式,但是新版flask一般表示通过这个写调试模式
- 使用配置对象加载默认配置
- 使用环境变量加载不想出现在代码中的敏感配置信息
def create_flask_app(config):
"""
创建Flask应用
:param config: 配置对象
:return: Flask应用
"""
app = Flask(__name__)
app.config.from_object(config)
# 从环境变量指向的配置文件中读取的配置信息会覆盖掉从配置对象中加载的同名参数
app.config.from_envvar("PROJECT_SETTING", silent=True)
return app
class DefaultConfig(object):
"""默认配置"""
SECRET_KEY = 'itcast1'
class DevelopmentConfig(DefaultConfig):
DEBUG=True
# app = create_flask_app(DefaultConfig)
app = create_flask_app(DevelopmentConfig)
@app.route("/")
def index():
print(app.config['SECRET_KEY'])
return "hello world"
3 app.run 参数(作为了解)
老版本flask有这种方式,新版本适用命令行方式进行启动
可以指定运行的主机IP地址,端口,是否开启调试模式
app.run(host="0.0.0.0", port=5000, debug = True)
关于DEBUG调试模式
- 程序代码修改后可以自动重启服务器
- 在服务器出现相关错误的时候可以直接将错误信息返回到前端进行展示
开发服务器运行方式
在1.0版本之后,Flask调整了开发服务器的启动方式,由代码编写app.run()
语句调整为命令flask run
启动。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello World'
# 程序中不用再写app.run()
1 终端启动
终端启动 ,不需要在代码中写 app.run()
flask run 会去读取FLASK_APP 的环境变量
可加.py 也可以不加.py .py以文件对待,不加的话以模块对待
$ export FLASK_APP=helloworld
$ flask run
* Running on http://127.0.0.1:5000/
说明
- 环境变量 FLASK_APP 指明flask的启动实例
flask run -h 0.0.0.0 -p 8000
绑定地址 端口flask run --help
获取帮助- 生产模式与开发模式的控制
通过FLASK_ENV
环境变量指明
-
export FLASK_ENV=production
运行在生产模式,未指明则默认为此方式 export FLASK_ENV=development
运行在开发模式
好处:代码不用变,通过命令使代码运行在不同方式
扩展
$ export FLASK_APP=helloworld
$ python -m flask run
* Running on http://127.0.0.1:5000/
2 Pycharm启动
设置环境变量
新版pycharm 是以module name运行的
旧版本Pycharm设置
不写,在这也会报错,不过没关系,也可以正常运行
flask 中请求钩子 和 Django 中中间件的意义一样
创建完工程首先设置解释器
flask视图中可以没有任何参数,不像Django要有一个request
Django返回的时候要有一个HTTPResponse对象或子类的对象(不确定),flask 可以用字符串返回
flask默认5000 端口,Django 默认8000端口
- Django配置模板需要以下的内容
运行不出结果时首先检查 代码问题
run server on http://0.0.0.0:8000
表示可以通过本机的任意ip 加8000端口访问到这个服务,如果有两块网卡的话,在本机上进行访问,通过127,网卡一地址,网卡二地址都可以进行访问
run server on http://127.0.0.1:8000
如果有两块网卡的话,在本机上进行访问,通过127,网卡一地址,网卡二地址都可以进行访问
这两个效果感觉一样