flask 框架 第二天学习

  • flask 转换器默认6个
    在这里插入图片描述

  • flask将session数据保存到了哪里
    在这里插入图片描述

  • 如果需要吧session信息存储到数据库中,需要使用扩展包 flask-session;

1.处理请求

  • 1.URL路径参数:url路径的一部分

    • 转换器:语法<>
    • 源码说明:正则实现
    import re
    # 返回:布尔值,True和False,match方法调用一次,编译一次
    re.match('1[3-9]..',mobile)
    # 返回:正则表达式编译的对象,compile方法编译一次,多次使用,效率相对更高
    rule_re = re.compile(字符串)
    
    
# 示例:url路径参数中的手机号
http://127.0.0.1:5000/users/13012345678
# 查询字符串:问号后面、等号传值、与号分隔
http://127.0.0.1:5000/?mobile=13012345678&user_id=2019

# 定义视图
@app.route('/users/<mobile>')
def get_mobile(mobile):
  print('mobile={}'.format(mobile))
  return 'hello world'
    
  • 自定义转换器:
# 自定义转换器:内置转换器不满足需求时,可以自定义,参考源码实现
# 步骤:
# 1.定义类
# 2.继承自BaseConverter
# 3.定义正则表达式
# 4.把自定义的转换器,添加到默认转换器字典中
class MobileConverter(BaseConverter):
    regex = '1[3-9]\d{9}'

app.url_map.converters['mobile'] = MobileConverter

@app.route('/<mobile:data>')
def get_mobile(data):
    print("mobile={}".format(data))
    return 'hello mobile {}'.format(data)
  • 2.处理请求request对象:args/form/method/url/headers/files
@app.route('/',methods=['POST','GET'])
def index():
    # 1-----args查询字符串,多个同名参数取第一个。
    # mobile = request.args.get('mobile')
    # print('mobile={}'.format(mobile))
    # user_id = request.args.get("user_id")
    # print("mobile={},user_id={}".format(mobile,user_id))

    # 2-----form表单
    # user = request.form.get('user')
    # pswd = request.form.get('pswd')
    # print(user,pswd)

    # 3-----method和url
    # print('*'*50)
    # print(request.method)
    # print(request.url)
    # print('*'*50)

    # 4-----headers表示报文头
    # User-Agent=你是谁?
    # Host=到哪去?
    # Referer=从哪来?可以用来CSRF防护,不可以只使用referer。

    # Host: 127.0.0.1:5000
    # Connection: keep-alive
    # Cache-Control: max-age=0
    # Upgrade-Insecure-Requests: 1 # 升级不安全请求,如果是http协议,默认加上https
    # User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
    # Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
    # Accept-Encoding: gzip, deflate, br
    # Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8,en;q=0.7,pt;q=0.6,fr;q=0.5

    # print('*'*50)
    # print(request.headers)
    # print('*'*50)

    # 5-----files属性:获取文件
    # print(request) # 对象
    image = request.files.get("image")
    # data = image.read()
    # with open('666.jpg','wb') as f:
    #     f.write(data)
    image.save('./666.png')
    return 'hello world'

2.处理响应

  • 模板:render_template(模板文件名)
  • 重定向:redirect(url地址)
  • json:摘森,实现跨语言、跨平台的数据交互。
    • jsonify函数:不仅会返回json数据,会把响应的类型改成application/json
    • json模块:
      • 1.dumps(python类型转json)和loads(json转python类型):操作的是变量,在内存中;
      • 2.dump和load:操作的是文件,在硬盘中;
  • 返回元组:自定义响应状态码、响应头信息

作业:Flask中能不能返回数值、列表、字典?

3.cookie和session

  • cookie:状态保持的一种方案(key/value形式),key/value存储在浏览器中,不安全,大小、数量有限制。
  • session:状态保持的一种方案(key/value形式),value存储在服务器中,key存在浏览器的cookie中;

4.异常处理

  • abort函数,参数是http异常状态码(4xx,5xx),作用终止视图的执行,类似于python中的raise语句
  • 工程开发中,abort一般会配合errorhandler一起使用,自定义错误信息,提高用户体验。

5.请求钩子

  • 4个请求钩子,2种形式:
  • 请求前执行:
    • 1.before_first_reqeust:在第一个请求前执行,执行一次
    • 2.before_request:每个请求前执行,执行多次
  • 请求后执行:
    • 1.after_request:在没有错误的情况下,请求后执行,必须接受响应(视图return返回的数据)作为参数,并返回响应;
    • 2.teardown_request:在有错误的情况下,请求后执行,必须接受错误信息作为参数

作业:请求钩子,请求后执行的2个钩子所谓的异常是指什么异常?

6.上下文

  • 请求上下文:

    • request:封装了HTTP请求的内容,针对的是http请求
    • session:用来记录请求会话中的信息,针对的是用户信息
  • 应用上下文:

    • current_app:程序实例app的代码,可以获取程序的配置信息,app的属性信息等,在不方便直接使用app的时候,可以使用current_app;
    • g:在一次请求过程中,不同函数之间传递数据
    # python中不同函数之间传递数据,需要定义参数
    def fun1():
      pass
    
    def fun2(args):
      pass
    f1 = fun1()
    fun2(f1)
    
    # 不同函数之间传递数据,不需要定义参数,使用g对象
    def db_query():
        # 使用g对象,获取数据
        print('g.user_id={},g.user_name={}'.format(g.user_id,g.user_name))
    
    @app.route('/')
    def index():
        # 使用g对象,定义数据
        g.user_id = 2019
        g.user_name = 'itcast_python29'
        db_query()
        return 'hello world'
    
    

7.综合案例:认证机制

  • 需求:web网站有很多页面,有些页面任何人都能访问,有些页面需要具备某种权限才能访问。
  • 原理:
    • 1.在每次请求前,尝试获取用户信息
    • 2.如果满足条件,运行进入视图,否则,不允许
  • 代码思路:首页和个人信息页
    • 1.before_request请求钩子,实现尝试获取用户信息,True或False
    • 2.如果True,允许进入首页和个人信息页,否则,只能允许进入首页
    • 3.可以把判断的功能,封装到装饰器中,需要具备权限才能访问的视图,加上装饰器,否则不加(不改变原有代码的前提下,添加新的功能代码)。

8.手动开启上下文

  • 应用上下文:with app.app_context()
  • 请求上下文:with app.request_context()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值