Flask_初始化参数_url添加变量,重定向,捕获错误,钩子等入门知识介绍

创建虚拟环境

操作和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

posted @ 2018-05-16 14:37  fanlei5458  阅读(302)  评论(0编辑  收藏  举报