Python Flask 编程 | 连载 03 - Flask 请求

一、Flask 请求

上下文对象 context,类似容器,存储了一些关键信息

  • 应用上下文
  • 请求上下文
  • 在分派请求之前激活应用上下文和请求上下文
  • 请求处理完之后将其删除

应用上下文对象 application context

应用上下文对象有两个,分别是 current_app 表示当前应用的实例以及 g 表示处理请求时临时存储对象,每次请求都会重设这个变量,并且 g 对象时线程隔离的,使用g对象需要导入,g 既 global。

在 app.py 中的 index 视图函数中打印出 current_app 和 g

python
复制代码
from flask import current_app, g

@app.route('/')
def index():
    print(current_app)
    print(type(current_app))
    print(dir(current_app))

    print(g)
    print(type(g))
    print(dir(g))

    print(current_app is app)

    info = {
        'message': "这是存在message变量中的信息",
    }
    return render_template('index.html', info=info)

image.png

current_app 是一个 Flask 类,包含了路由、响应、设置、模板等各种方法。

g 临时对象中包含了 get 方法、pop 方法和 setdefault 方法,可以用来保存和删除某些临时信息。

请求上下文

请求上下文对象有两个,分别是:

  • request 对象:请求对象,封装了客户端发出的HTTP请求

    • method:请求类型,如 GET、POST 等
    • form:POST 请求数据,dict类型
    • args:GET 请求的数据,dict类型
    • values:POST 请求和 GET 请求数据集合,dict类型
    • files:上传文件的数据,dict 类型
    • cookies:请求中存储的 cookie,dict 类型
    • headers:HTTP 请求头
  • sessio 对象:用户会话,是一个字典类型,存储在服务端,请求之间数据共享

新增视图函数 get_params,获取 get 请求中的参数

python
复制代码
from flask import request

@app.route("/params")
def get_params():
    params = request.args
    print('请求中传入的参数为:{}'.format(params))
    print('传入参数的格式为:{}'.format(type(params)))
    print('是否是一个字典类型:{}'.format(isinstance(params, dict)))
    print('params中name的值为:{}'.format(params.get('name')))
    print('params中address的值为:{}'.format(params.get('address')))
    return "SUCCESS"

重启应用,在浏览器输入 http://127.0.0.1:5000/params?name=stark&address=NY

image.png

当请求传递参数为空时,输出为 None,也可以给没有传值的参数设置默认值,在 get_params 视图函数中增加代码

python
复制代码
nickname = request.args.get('nickname', 'IronMan')
print('params中nickname的值为:{}'.format(nickname))

新增视图函数 get_headers,解析请求头中的IP地址

python
复制代码
@app.route('/headers')
def get_headers():
    # 获取请求头中的Host
    headers = request.headers
    print("获取到的请求头为:{}".format(headers))
    print('请求头的数据类型为:{}'.format(type(headers)))
    host = request.host
    print('请求中的host为:{}'.format(host))
    print('请求中的host的数据类型为为:{}'.format(type(host)))
    host_url = request.host_url
    print('请求中的host_url为:{}'.format(host_url))

    # 获取远程IP地址
    remote_addr = request.remote_addr
    print('请求的远程IP地址为:{}'.format(remote_addr))

    # 获取代理
    user_agent = request.user_agent
    print('请求代理为:{}'.format(user_agent))
    return 'SUCCESS'

image.png

image.png

请求钩子函数

请求钩子函数可以对请求进行鉴权或者限制某些 IP 的恶意请求:

  • before_first_request,在服务器初始化后第一个请求到达前执行,只会执行一次
  • before_request,每一个请求到达前执行
  • after_request,每次请求处理完成之后执行,如果请求中出现了异常,则不执行
  • teardown_request,每次请求处理完之后执行,如果请求过程中出现了异常,也能执行
  • errorhandler,对异常进行处理,当视图函数中中抛出了错误, 并且错误码能够匹配上注册的 errorhandler 的错误码时会被触发

新增四个视图函数

python
复制代码
@app.before_first_request
def first_request():
    '''服务器启动后第一个请求到达'''
    print('服务器启动后的第一个请求')


@app.before_request
def before_request():
    print('每个请求处理前都会运行的方法')

重启服务后,浏览器输入 http://127.0.0.1:5000/params?name=stark&address=NY

image.png

清除控制台的日志,再次请求。

image.png

after_request 和 teardown_request 两个钩子函数必须包含一个 response 作为参数,after_request 必须返回 response,teardown_request 则不要求,因为这两个参数是请求处理完之后执行,可以对请求响应做一些处理后返回给用户,如对异常或者报错进行封装处理。

再增加两个视图函数

python
复制代码
@app.after_request
def after_request(response):
    print(response.headers)
    print('每个请求处理后都会运行的方法,有异常不执行')
    return response


@app.teardown_request
def teardown_request(response):
    print('每个请求处理前都后运行的方法,有异常也会执行')
    return response

重启服务,浏览器输入 http://127.0.0.1:5000/params?name=stark&address=NY

image.png

这里给大家分享一份Python全套学习资料,包括学习路线、软件、源码、视频、面试题等等,都是我自己学习时整理的,希望可以对正在学习或者想要学习Python的朋友有帮助!

CSDN大礼包:全网最全《全套Python学习资料》免费分享🎁

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

👉CSDN大礼包🎁:全网最全《Python学习资料》免费分享(安全链接,放心点击)👈

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述
因篇幅有限,仅展示部分资料

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

5️⃣Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述
在这里插入图片描述
上述所有资料 ⚡️ ,朋友们如果有需要 📦《全套Python学习资料》的,可以扫描下方二维码免费领取 🆓
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

👉CSDN大礼包🎁:全网最全《Python学习资料》免费分享(安全链接,放心点击)👈

  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值