#pip3 install pipenv #安装pipenv虚拟环境工具
#pipenv install #创建一个虚拟环境
#pipenv shell #进入虚拟环境
vir#pipenv install flask #虚拟环境中安装flask包
vir#pipenv install python-dotenv #虚拟环境中安装python-dotenv包,用于管理环境变量:1.公共环境变量.flaskenv和私密环境变量.env文件
vir#pipenv install watchdog --dev #flask默认的reloading重载器效果不精准,一般也只是在开发阶段使用
1. flask资源路径配置
可以区分静态资源路径和视图资源路径
2. flask文件中,app.run()默认是运行当前页面的app
但如果在文件头import别的包,则会运行别的包的app,非当前页面app
3. flask配置文件
3.1 FLASK 配置参数
3.1.1 手动创建配置文件,读取配置
app.config.cfg.from_pyfile("config.cfg") #相对路径
3.1.2 从对象中导入
class Config(object):
DEBUG = True
app.config.from_object(Config)
3.1.3 直接将app.config当成字典用
app.config['DEBUG'] = True
3.1.4 在app.run()中设置
if __name__ == '__main__':
app.run(host = '0.0.0.0', port = 5000, debug = True)
3.2 程序公共配置参数
3.2.1 使用自定义类的方式
class Config(object):
DEBUG = True
TEST_Flag = 'flask_test'
print(app.config.get('flask_test'))
3.2.2 使用current_app
from flask import current_app
print(current_app.config.get('flask_test')) #使用形式跟3.2.1相似, current_app即是app的同名词
4. 设置ip访问为所有主机都可访问
if __name__ == '__main__':
app.run(host = '0.0.0.0', port = 5000)
5. 路由和视图
5.1 查看flask所有路由
print(app.url_map)
5.2 设置客户端url的方式(默认为GET)
@app.route("/post_only", methods=['GET', 'POST'])
5.3 定义2个路径相同的装饰器,访问不同视图函数
默认路由识别到最早出现的视图函数,除非将前面的method定义为POST方式加以区别
@app.route("/hello", method=['POST'])
def hello():
return "hello1"
@app.route("/hello")
def hello2():
return "hello2"
5.4 页面跳转
5.4.1 页面指定跳转
from flask import redirect
url = url_for(view_func_name)
redirect(url)
5.4.2 调到前一个页面
参看《flaskweb开发实战入门进阶与原理解析.pdf》P58
5.5 路由提取参数 和 自定义路由转换器
5.5.1 flask自带的路由提取参数
@app.route("/greet/<int:name_id>")
def greet_name(name_id):
return "hello %s" % name_id
5.5.2 自定义路由转换器(解析规则可以自定义)
有2种方式
参看网络资料,这个功能完全可以通过传参来实现,了解即可
6. 提取request对象中的数据
6.1 request常用的属性和方法提取客户端数据
见书P32,
6.1.1 提取body中数据
form:表单格式数据 request.form.get()
data:body请求体中获取数据 request.data.get()
6.1.2 提取url中的参数 request.args.get()
args:url中的?后面的参数
PS:即使url中带了args参数,也可以用POST方法,可以既获取url参数同时获取POST数据
6.1.3 提取method 用于在相同视图函数做不同功能
@app.route('index', methods=['GET', 'POST'])
def index():
if request.method == 'GET':
return render(request, 'regitst.htm;')
else:
......
6.1.4 提取文件数据
方式一:
@app.route('upload', methods=['POST'])
def upload():
file_obj = request.files.get('pic') #form data, name is 'pic'
if file_obj is None:
return 'No file'
f = open('./test.png', 'wb')
data = file_obj.read()
f.write(data)
f.close()
return 'upload success'
方式二:
@app.route('upload', methods=['POST'])
def upload():
file_obj = request.files.get('pic') #form data, name is 'pic'
if file_obj is None:
return 'No file'
file_obj.save('./test.png')
return 'upload success'
7. 异常错误处理
7.1 abort()
7.1.1 返回客户端一个标准错误码
注意,abort(错误码) 错误码必须是标准错误码,其他错误码则会运行异常
def login():
name = ''
if name != 'kluter':
abort(400)
return ‘Login success’
7.1.2 返回Response对象(不常用,可直接用return替代)
def login():
name = ''
if name != 'kluter':
resp = Response('login failed!')
abort(resp)
return ‘Login success’
7.2 使用@app.errorhandler()自定义异常
@app.errorhandler(404)
def handle_404_error(err):
return 'accur error, msg[%s]' % err
即便在别的地方abort了标准的错误,也会进入这个自定义错误处理方式
8. Response响应体
8.1 返回tuple元祖(了解)
return a, b, c 这种形式,实际上是返回的元祖(a, b, c)
@app.route('/')
def index():
# body status code response-header
return 'index page', 400, [('name1', 'python'), ('name2', 'python2')] #header is list
return 'index page', 400, {'name1': 'python', 'name2': 'python2'} #header is dict
return 'index page', 666, {'name1': 'python', 'name2': 'python2'} #status code can be self-define
return 'index page', '666 selfC', {'name1': 'python', 'name2': 'python2'} #status code can be self-define string
8.2 (推荐方式)make_response()
@app.route('/')
def index():
resp = make_response('index page') #body
resp.status = 999 #ret code
resp.headers['name1'] = 'python'
return resp
8.3 响应json字符串
json本质实际上是字符串
8.3.1 python中json字符串和python字典的相互转换
8.3.2 原始方式实现
原始实现方式,必须要在return的时候带上Header的返回值类型:{"Content-Type": "application/json"}。 若不带上,前端不知道你返回的数据类型是json字符串,而仅仅是普通字符串
8.3.3 flask方式实现
jsonify,自动帮你把字典转换为json字符串,并设置header的content-type