zoukankan      html  css  js  c++  java
  • Flask基本使用

    1.Flask路由 

    1.1 定义路由 

    from flask import Flask
    
    app = Flask(__name__)
    
    # 1.路由对应的URL必须以/开头
    # 2.通过app的url_map属性获取所有的路由规则 (URL资源段 支持的请求方式 视图函数标记)
    # 3.可以通过route方法的methods参数指定路由支持的请求方式
    @app.route('/hello', methods=['post', 'get'])
    def index():
        return "index"
    
    
    if __name__ == '__main__':
        print(app.url_map)
    
        # 获取路由信息
        # for rule in app.url_map.iter_rules():
        #     print(rule.rule, rule.methods, rule.endpoint)
    
        app.run(debug=True)

    1.2 路由变量:  传递URL路径参数, 实现动态URL

    from flask import Flask
    
    app = Flask(__name__)
    
    # 路由变量: 传递URL路径参数
    # 格式: /user/<路由变量名>
    @app.route('/user/<userid>')
    def index(userid):  # 必须定义同名形参接收路由变量的值
        print(userid)
        return "index"
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    1.3 路由转换器: 对URL传递的参数进行格式校验, 类似Django设置URL时的正则表达式参数

    from flask import Flask
    
    app = Flask(__name__)
    
    # 路由转换器: 对路由变量进行格式校验  条件不满足返回404
    # 格式: /user/<路由转换器名:路由变量>
    @app.route('/user/<int:userid>')  # int: 内置转换器, 要求1-n个整数
    def index(userid):
        print(userid)
        return "index"
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    1.4 自定义转换器: 开发者还可以自定义转换器, 更加灵活的校验路由变量

    # 自定义转换器:
    # 1.定义转换器类, 继承BaseConverter
    # 2.设置regex属性 (正则匹配规则)
    # 3.添加自定义转换器
    
    from flask import Flask
    from werkzeug.routing import BaseConverter
    
    app = Flask(__name__)
    
    # 1.定义转换器类:继承自BaseConverter
    class MobileConverter(BaseConverter):
        # 2.设置regex属性(匹配规则)
        regex = '1[3-9]d{9}$'  # 不要设置开头的^
    
    
    # 3.添加自定义转换器: 往app,url_map.cpnverters添加转换器
    app.url_map.converters['mob'] = MobileConverter
    
    
    @app.route('/user/<mob:mobile>')
    def index(mobile):
        print(mobile)
        return "index"
    
    
    if __name__ == '__main__':
        # 获取所有的转换器 {转换器名: 转换器类}
        # print(app.url_map.converters)
        app.run(debug=True)

    2. Flask请求: flask的请求数据通过 request 对象来获取

      

    from flask import Flask, request
    from werkzeug.datastructures import FileStorage
    
    app = Flask(__name__)
    
    
    @app.route('/', methods=['get', 'post'])
    def index():
        # 获取请求的基础数据
        # print(request.url)  # 请求的URL
        # print(request.method)  # 本次请求的请求方式
        # print(request.headers)  # 获取请求头信息  类字典对象
    
        # print(request.headers['Host'])
        # print(request.headers.get('Host'))  # 建议使用get方法, 键不存在不报错
    
        # 请求传递数据 1> URL路径 -> 路由变量  2> 查询字符串 get  3> 请求体  post  4> 请求头 -> request.headers
    
        # 获取查询字符串 -> request.args  xx?name=zs&age=20  类字典对象
        # print(request.args.get('name'))
        # print(request.args.get('age'))
    
        # 请求体:   键值对(表单)   文本(json/xml)  文件(图片/音频)
    
        # 获取post键值对 -> request.form  类字典对象
        # print(request.form.get('username'))
    
        # 获取post文本数据 -> request.data / request.json
        # print(request.data)  # 返回bytes类型
        # print(request.json.get('age'))  # request.json直接将json字符串转为字典
    
        # 获取post文件 -> request.files  类字典对象
        file = request.files.get("avatar")  # type: FileStorage
        # print(type(file))  # 返回 FileStorage文件对象
        # 将文件保存到本地
        file.save('123.jpg')
    
        # 获取文件的二进制数据
        # img_bytes = file.read()
        # print(img_bytes)
    
        return "index"
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    3. Flask响应

    3.1 访问静态资源

    设置步骤:

    ① 将静态资源放入到 项目的 static 文件夹中
    ② 通过内置的静态资源的访问路由, URL路径格式为 /static/<filename>
            如 static目录放入文件 123.jpg, 则访问URL为 http://127.0.0.1:5000/static/123.jpg

    Flask对象的初始化参数 也可以 修改静态资源的存储和访问路径

    from flask import Flask
    
    app = Flask(__name__,  # 导入名称, flask会根据该参数查询静态文件的存储路径
                # 官方建议直接使用__name__, 表示从当前目录中查询静态文件存储路径
                static_folder="static1",  # 设置静态文件的存储目录
                static_url_path='/res/img',  # 设置静态文件的URL访问路径 如 127.0.0.1:5000/res/img/123.jpg
                )
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    3.2 设置响应数据:

    Flask中设置响应数据主要有两种方式:
        设置多个返回值
        自定义响应对象

    3.2.1 三个返回值: Flask中 视图函数的返回值可以设置三个, 分别对应 响应体, 响应状态码, 响应头

    from flask import Flask, redirect, url_for
    
    app = Flask(__name__)
    
    
    @app.route('/demo1')
    def demo1():
        # 返回值:  响应体, 响应状态码, 响应头
        return 'demo1', 400, {'A': 40}

    3.2.2 自定义响应对象: 视图函数返回的 str / bytes 类型数据会被包装为 Response 响应对象, 也可以 创建响应对象来 自定义响应头 等信息

    # 自定义响应对象
    @app.route('/demo2')
    def demo2():
        # 视图函数的返回值可以为str/bytes类型, 并且flask内部会将其包装为Response响应对象
        # return 'hello flask'
    
        # 创建响应对象     设置响应头时,需要手动创建响应对象
        response = make_response('hello flask')  # type: Response ==>指定了response的类型从而使headers能被点出来
        # 设置响应头
        response.headers['B'] = 10
        return response
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    3.3 返回Json:

      不推荐使用 json.dumps() 直接返回, 返回的数据要符合 HTTP 协议规范, JSON 需要指定 content-type:application/json

      接口需要返回 JSON 数据,在 Flask 中可以直接使用 jsonify() 生成一个 JSON 的响应

    from flask import Flask, make_response, Response, jsonify
    
    app = Flask(__name__)
    
    
    @app.route('/demo3')
    def demo3():
    
        dict1 = {'name': 'zs', 'age': 20}
        # 字典转json字符串
        # return json.dumps(dict1)
    
        # 可以将字典转json字符串, 并且设置响应头的content-type为application/json
        # return jsonify(dict1)
        return jsonify(name='zs', age=20)  # 也支持关键字实参的形式
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    3.4 重定向: flask中通过 redirect() 实现重定向功能

    from flask import Flask, redirect
    
    app = Flask(__name__)
    
    
    @app.route('/demo3')
    def demo3():
    
        return jsonify(name='zs', age=20)  
    
    
    @app.route('/demo4')
    def demo4():
        # 重定向到指定网站
        # return redirect('http://www.baidu.com')
        # 重定向到自己的路由   只需要URL资源段
        return redirect('/demo3')
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    4 状态保持: Cookie 和 Session

    4.1 Cookie

    特点:
        将数据保存在 客户端 (用户的电脑上), 可以减轻服务器压力
        访问网站时, 浏览器会 自动 将该网站的cookie数据发送给服务器
    使用场景:
        保存一些 不太重要的数据 

    代码示例:

    from flask import Flask, make_response, Response, request
    
    app = Flask(__name__)
    
    
    @app.route('/')
    def index():
        # 后端设置cookie:  通过响应体的set_cookie字段
    
        # 创建响应对象
        response = make_response('index')  # type: Response
    
        # 设置响应头的set_cookie字段  value必须是str/bytes类型
        response.set_cookie('per_page', '10', max_age=86400)
    
        # 删除cookie   本质: 设置max-age=0
        # response.delete_cookie('per_page')
    
        # 返回响应对象
        return response
    
    @app.route('/demo1')
    def demo1():
        # 获取cookie:  浏览器会自动通过请求头的cookie字段来传递cookie数据
    
        # request.cookies 直接获取到字典形式的cookie数据
        print(request.cookies.get('per_page'))
    
        return 'demo1'
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    4.2 Session

    特点:
        将数据保存在 服务端 (服务器的数据库中), 安全性更高
    使用场景:
        保存一些 重要/敏感的数据

    代码示例:

    from datetime import timedelta
    from flask import Flask, session
    
    app = Flask(__name__)
    # 设置应用秘钥   会被用于session签名
    app.secret_key = 'test'
    # 设置session过期时间   默认31天
    app.permanent_session_lifetime = timedelta(days=14)
    
    
    @app.route('/')
    def index():
        # session是一个类字典对象, 对其取值/赋值 就可以实现session数据的读写
    
        # 记录session数据
        session['username'] = 'zs'
    
        # 设置session支持过期时间
        session.permanent = True
    
        # 删除session数据
        # session.pop('username')
    
        return "index"
    
    
    @app.route('/demo1')
    def demo1():
    
        # 获取session数据
        name = session.get('username')
        print(name)
        return 'demo1'

    5. 异常处理: flask对 HTTP错误 进行了封装, 可以捕获http错误, 也可以主动抛出http错误

    from flask import Flask, abort
    # flask对http错误进行了封装, 可以捕获http错误也可以主动抛出http错误
    
    app = Flask(__name__)
    
    # 捕获http错误
    @app.errorhandler(404)
    def error_404(error):  # 一旦进行捕获, 要求必须定义形参接收具体错误信息
        return "<h3>您访问的页面去浪迹天涯了</h3> %s" % error
    
    
    # 还可以捕获系统内置错误
    @app.errorhandler(ZeroDivisionError)
    def error_zero(error):
        return '除数不能为0'
    
    
    @app.route('/')
    def index():
        # a = 1 / 0
    
        abort(500)  # 主动抛出异常 (只能抛出http错误)
        return "index"
    
    
    if __name__ == '__main__':
        app.run(debug=True)

        

        

  • 相关阅读:
    阅读笔记《梦断代码》其一
    第一次冲刺(第九天)
    第一次冲刺(第八天)
    第一冲刺阶段(第七天)
    第一冲刺阶段(第六天)
    第一冲刺阶段(第五天)
    MySQL数据库半同步复制
    MySQL事物
    MySQL字符编码
    MySQL用户授权
  • 原文地址:https://www.cnblogs.com/yqyn-study/p/13504187.html
Copyright © 2011-2022 走看看