创建虚拟环境
操作和DJango创建虚拟环境一样,毕竟都是创建虚拟环境.
创建python3版本的的虚拟环境
mkvirtualenv -p python3 py3_flask
创建python2版本的的虚拟环境
mkvirtualenv py_flask
删除虚拟环境
rmvirtualenv py3_flask
安装flask-0.10.1的包
pip install flask==0.10.1
初始化参数 app=Flask(参数)
import_name
Flask程序所在的包(模块),传 __name__ 就可以
其可以决定 Flask 在访问静态文件时查找的路径
static_path
静态文件访问路径(不推荐使用,使用 static_url_path 代替)
static_url_path
静态文件访问路径,可以不传,默认为:/ + static_folder
static_folder
静态文件存储的文件夹,可以不传,默认为 static
template_folder
模板文件存储的文件夹,可以不传,默认为 templates
程序加载配置
# 从配置对象中加载(常用)
app.config.from_object(obj)
# 从配置文件中加载
app.config.from_pyfile(filename)
给url添加变量
# username默认接收字符串类型的参数
@app.route('/holle/<username>')
def hello_world(username):
return 'Hello %s' % username
# 指定num只能接收整数>.
@app.route('/index/<int:num>')
def index(num):
return '这是第%s页' % num
说明:
这里的int是一个转换器,其他的转化器还有:
int: 接收整数
float: 接收整数和浮点数
path: 和默认的类似,但也接收斜线
自动重定向行为(url斜杠说明),及手动重定向
# url必须以斜杠开头,
# url末尾如果加了斜杠,但游览器访问的时候没有加,该访问会被flask自动重定向到带斜杠的url
@app.route('/slash/test/')
def slash():
return '/slash/test/'
# 如果url末尾没有斜杠,访问的时候末尾却带上斜杠会报 404 错误
@app.route('/slash/test')
def slash():
return '/slash/test'
# 手动重定向
# 直接重定向到自己的url路径
@app.route('/test2')
def test2():
return redirect('/index')
# 重定向到index视图函数所对应的url中
@app.route('/test3')
def test3():
return redirect(url_for('index'))
# 重定向到带有参数的视图中去
@app.route('/test3')
def test3():
return redirect(url_for('page', num=100))
请求方式
在Flask中,定义一个路由,默认的请求方式为:
GET
OPTIONS(自带)
HEAD(自带)
# 指定请求方式:
@app.route('/test', methods=["GET", "POST"])
def test():
return request.method
使用jsonify返回JSON格式数据
@app.route('/return/json')
def return_json():
json_dict = {
'name': 'tom',
'age': 18
}
return jsonify(json_dict)
捕获错误
# 捕获指定错误
# 当发生页面发生404错误的时候,采用下面的方法处理
@app.errorhandler(404)
def not_found_page(e):
return "你找不到,嘿嘿"
# errorhandler也可以捕获代码出现的错误
@app.errorhandler(ZeroDivisionError)
def zero_division_error(e):
return '你猜除数能不能为0'
请求钩子
应用场景:为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。如:
在请求开始时,建立数据库连接;
在请求开始时,根据需求进行权限校验;
在请求结束时,指定数据的交互格式;
Flask支持如下四种请求钩子:
1. before_first_request
在处理第一个请求前执行
2. before_request
在每次请求前执行
如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
3. after_request
如果没有抛出错误,在每次请求后执行
接受一个参数:视图函数作出的响应
在此函数中可以对响应值在返回之前做最后一步修改处理
需要将参数中的响应在此参数中进行返回
4. teardown_request:
在每次请求后执行
接受一个参数:错误信息,如果有相关错误抛出
代码测试
代码示例
@app.before_first_request
def before_first_request():
print('首次请求之前执行before_first_request')
@app.before_request
def before_request():
print('在每一次请求之前执行before_request')
# 如果这里return了,那么视图函数将不会被调用
# return '请求不成功'
@app.teardown_request
def teardown_request(error):
print('每一次请求之后调用teardown')
print(error)
# 执行完视图函数之后,会自动把该视图的相应作为第一个参数传入
@app.after_request
def after_request(response):
print('在请求成功过之后执行after_request')
print(response)
response.headers["Content-Type"] = "application/json"
return response
文件上传
# 视图
@app.route('/index/a.jpg', methods=['POST'])
def save_img():
pic = request.files.get('pic')
# pic.save('./static/a.jpg')
# pic.save('./static/' + secure_filename(pic.filename))
pic.save('./static/' + pic.filename)
return '文件上传成功'
# 对应模板说明
# method必须设置为post.
# enctype必须设置为multipart/form-data不然游览器根本不会发送文件
<form action="/index/a.jpg" method="post" enctype="multipart/form-data">
<input type="file" name="pic" id="">
<br>
<input type="submit" name="" id="">
</form>
状态保持
@app.route('/')
def set_cookie():
# make_response自定义响应的类容
resp = make_response('我设置了一个cookie,不信你看')
resp.set_cookie('name','jquery')
return resp
@app.route('/get')
def get_cookie():
resp = request.cookies.get('name')
return '我获取到cookie:'+resp