《Flask Web开发实战:入门、进阶与原理解析》笔记 --- 2. Flask与HTTP(上)

本文深入探讨了Flask框架如何处理HTTP请求和响应,包括请求的解析、路由匹配、视图函数执行以及响应的生成过程。同时,文章还讲解了如何在Flask中设置HTTP方法、处理URL参数和使用请求钩子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • HTTP (超文本传输协议)定义了服务器和客户端之间信息交流的格式和传递方式,他是万维网(WWW)中数据交互的基础
  • 一个Flask程序工作的实际流程:
    在这里插入图片描述
    HTTP是客户端与服务器的连接方式,WSGI是服务器接受数据与Flask的链接方式。

在程序中,Flask根据请求的URL执行对应的试图函数,获取返回值生成相应。相应一次经过WSGI转换成HTTP相应,再经由Web服务器传递,最终被发出请求的客户端接收。

  • HTTP请求:以 http://helloflask.com/hello?name=Grey 为例:
    在这里插入图片描述

  • 请求报文:

    请求的实质是发送到服务器上的一些数据,这种浏览器与服务器之间交互的数据被称为报文,请求时浏览器发送的数据被称为请求报文,而服务器返回的数据被称为响应报文。
    请求的报文由请求的方法、URL、协议版本、首部字段以及内容实体组成。在这里插入图片描述

    HTTP通过请求方法区别不同的请求类型:
    在这里插入图片描述

  • request对象:当Flask接收到请求后,请求对象会提供多个属性来获取URL的各个部分:在这里插入图片描述
    除了url,请求报文中的其他信息都可以通过request对象提供的属性和方法获取:在这里插入图片描述
    ps:和普通的字典类型不同,当从request对象的类型为MutliDict或Immutable Multi Dict的属性(比如request.args[‘name’]),如果没有对应的键,会返回HTTP 400错误响应,而不是抛出KEY ERROR。为了避免这个错误,我们应该使用get()获取数据,如果没有对应的值,会返回None;get()方法的第二个参数可以设置默认值。
    在这里插入图片描述

  • 路由匹配
    >url是指向网络上资源的地址,在Flask中,我们需要让请求的URL匹配对应的视图函数,返回值就是URL对应的资源。

    app.url_map:路由表,定义了URL规则和视图函数的映射关系。Flaks会根据请求报文中的URL规则进行匹配,如果匹配不成功,会自动返回404错误响应。
    使用flask routes命令可以查看程序中定义的所有路由:
    

在这里插入图片描述
endpoint 每个路由对应的端点;Methods 方法;Rule url规则
static端点是Flask添加的特殊路由,用来采访静态文件

  • 设置监听的HTTP方法
    可以在app.route()中使用methods参数传入一个包含监听的HTTP方法的可迭代对象。
    在这里插入图片描述
    当某个请求的方法不符合要求时,将无法正常处理。如,在表单提交时通常使用post,而提交的目标URL对应的视图函数只允许用GET,Flask会自动返回一个405(请求方法不允许)的错误响应。

  • url处理
    在这里插入图片描述
    输入http://localhost:5000/goback/34:
    在这里插入图片描述
    在url中添加一个数字作为时光倒流的年数。在这里插入图片描述
    < int:year>表示为year变量添加一个int转换器,Flask会解析这个变量将其转换为整型。
    在这里插入图片描述
    <转换器:变量名>,若不使用转换器,year会默认转换为字符串,若输入的是英文字母,会抛出value error异常,需要自动验证,转换后,如果url中传入的变量不是数字,直接返回404.
    any转换器:在后面添加括号来给出可选值
    在这里插入图片描述
    如果想在any转换器中传入一个预先定义的列表,可用格式化字符串的方法(使用%或是format()函数)来构建url规则字符串:

    colors = ['blue', 'white', 'red']
    @app.route('/colors/<any(%s):color>' % str(colors)[1:-1])
    
  • 请求钩子:用来注册在请求处理的不同阶段执行的处理函数,或称为回调函数,即callback。
    在这里插入图片描述
    每个钩子可以注册任意多个处理函数,函数名并不是必须和钩子名称相同:
    在这里插入图片描述
    假如创建三个视图函数A B C,其中视图C使用了after_this_request钩子,那么当请求A进入后,整个请求处理周期的请求处理函数调用流程:
    在这里插入图片描述
    请求钩子常用应用场景:

  • before_this_request:在玩具程序中,运行程序前需要进行一些初始化操作,比如创建数据库,添加管理员用户

  • before_request:网站上要记录用户最后在线的时间,可以通过用户最后发送的请求时间来实现。为了避免在每个视图函数都添加更新在线时间的代码,可使用这个钩子

  • after_request:在视图函数中进行数据库操作,如更新、插入等,之后需要更新提交到数据库中

  • teardown_request:对于多个视图函数需要建立和关闭数据库连接,理想的方法是在请求之前(before_request)建立连接,在请求之后(teardown_request)关闭连接。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值