• 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
    

  • 相关阅读:
    人生苦短我学Java-1-Helloword
    python-51-MySQLdb查询返回dict格式
    IDEA/PyCharm等系列-会了这些设置编码舒服而效率又提高了一截
    jacoco-2-jenkins集成代码测试覆盖率
    jacoco-1-java代码测试覆盖率之本地环境初体验
    wordpress 安装提示 Error Establishing a Database Connection
    mysql 8.0 重置 root 账户密码
    Ubuntu 20.04 卸载 snapd
    VSCode 扩展选择快捷键插件 Quick and Simple Text Selection
    Swagger 响应数据 response 里包含动态变化的对象 key 的方法
  • 原文地址:https://www.cnblogs.com/fanlei5458/p/9235465.html
Copyright © 2020-2023  润新知