返回顶部
首页 > 资讯 > 后端开发 > Python >Flask入门很轻松 (二)
  • 231
分享到

Flask入门很轻松 (二)

入门轻松Flask 2023-01-31 00:01:24 231人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10959454.html 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接; 在请求

转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10959454.html

在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:

  • 在请求开始时,建立数据库连接;
  • 在请求开始时,根据需求进行权限校验;
  • 在请求结束时,指定数据的交互格式;

为了让每个视图函数避免编写重复功能的代码,flask提供了通用设置的功能,即请求钩子。

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

  • before_first_request
    • 在处理第一个请求前执行
  • before_request
    • 在每次请求前执行
    • 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
  • after_request
    • 如果没有抛出错误,在每次请求后执行
    • 接受一个参数:视图函数作出的响应
    • 在此函数中可以对响应值在返回之前做最后一步修改处理
    • 需要将参数中的响应在此参数中进行返回
  • teardown_request:
    • 在每次请求后执行
    • 接受一个参数:错误信息,如果有相关错误抛出
    • 需要设置flask的配置DEBUG=False,teardown_request才会接受到异常对象。

代码

config.py

class Config(object):
    DEBUG = True
    SECRET_KEY = "abcccddgadsag"
 

hook.py

from flask import Flask
from config import Config

app = Flask(__name__)
app.config.from_object(Config)

@app.before_first_request
def before_firest_request():
    print("----- before_first_requets-----")
    print("系统初始化的时候,执行这个钩子方法")
    print("会在接收到第一个用户请求时,执行这里的代码")


@app.before_request
def before_request():
    print("----before request")
    print("每一次接收到用户请求时,执行这个钩子方法")
    print("一般可以用来判断权限,或者转换路由参数或者预处理客户端的请求的数据")


@app.after_request
def after_request(response):
    print("----after_request----")
    print("在处理请求以后,执行这个钩子方法")
    print("一般可以用于记录会员/管理员的操作历史,浏览历史,清理收尾的工作")
    response.headers["Content-Type"] = "application/JSON"
    return response


@app.teardown_request
def teardown_request(exc):
    print("----teardown_request----")
    print("在每一次请求以后,执行这个钩子方法,如果有异常错误,则会传递错误异常对象到当前方法的参数中")
    print(exc)


@app.route("/hook")
def hook():
    print("----这是视图函数----")
    print("视图函数被运行了")
    return "这是视图函数"


if __name__ == '__main__':
    app.run(host="127.0.0.1", port=80)
  • 请求时的打印:
----- before_first_requets-----
系统初始化的时候,执行这个钩子方法
会在接收到第一个用户请求时,执行这里的代码
----before request
每一次接收到用户请求时,执行这个钩子方法
一般可以用来判断权限,或者转换路由参数或者预处理客户端的请求的数据
----这是视图函数----
视图函数被运行了
----after_request----
在处理请求以后,执行这个钩子方法
一般可以用于记录会员/管理员的操作历史,浏览历史,清理收尾的工作
----teardown_request----
在每一次请求以后,执行这个钩子方法,如果有异常错误,则会传递错误异常对象到当前方法的参数中
None

主动抛出Http异常

  • abort 方法
    • 抛出一个给定状态代码的 HTTPException 或者 指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。
  • 参数:
    • code – HTTP的错误状态码
# abort(404)
abort(500)

抛出状态码的话,只能抛出 HTTP 协议的错误状态码

捕获错误

  • errorhandler 装饰器
    • 注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法
  • 参数:
    • code_or_exception – HTTP的错误状态码或指定异常
  • 例如统一处理状态码为500的错误给用户友好的提示:
@app.errorhandler(500)
def internal_server_error(e):
    return '服务器搬家了'
  • 捕获指定异常类型
@app.errorhandler(ZeroDivisionError)
def zero_division_error(e):
    return '除数不能为0'

上下文:即语境,语意,在程序中可以理解为在代码执行到某一时刻时,根据之前代码所做的操作以及下文即将要执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以完成的事情。

Flask中有两种上下文,请求上下文(request context)和应用上下文(application context)。

Flask中上下文对象:相当于一个容器,保存了 Flask 程序运行过程中的一些信息。

  1. application 指的就是当你调用app = Flask(__name__)创建的这个对象app
  2. request 指的是每次http请求发生时,WSGI server(比如gunicorn)调用Flask.__call__()之后,在Flask对象内部创建的Request对象;
  3. application 表示用于响应WSGI请求的应用本身,request 表示每次http请求;
  4. application的生命周期大于request,一个application存活期间,可能发生多次http请求,所以,也就会有多个request

请求上下文(request context)

思考:在视图函数中,如何取到当前请求的相关数据?比如:请求地址,请求方式,cookie等等

在 flask 中,可以直接在视图函数中使用 request 这个对象进行获取相关数据,而 request 就是请求上下文的对象,保存了当前本次请求的相关数据,请求上下文对象有:request、session

  • request
    • 封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get('user'),获取的是get请求的参数。
  • session
    • 用来记录请求会话中的信息,针对的是用户信息。举例:session['name'] = user.id,可以记录用户信息。还可以通过session.get('name')获取用户信息。

应用上下文(application context)

它的字面意思是 应用上下文,但它不是一直存在的,它只是request context 中的一个对 app 的代理(人),所谓local proxy。它的作用主要是帮助 request 获取当前的应用,它是伴 request 而生,随 request 而灭的。

应用上下文对象有:current_app,g

current_app

应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量,例如:

  • 应用的启动脚本是哪个文件,启动时指定了哪些参数
  • 加载了哪些配置文件,导入了哪些配置
  • 连接了哪个数据库
  • 有哪些可以调用的工具类、常量
  • 当前flask应用在哪个机器上,哪个IP上运行,内存多大
current_app.name
current_app.test_value='value'

g变量

g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别

g.name='abc'

注意:不同的请求,会有不同的全局变量

两者区别:

  • 请求上下文:保存了客户端和服务器交互的数据
  • 应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等
from flask import Flask
# 新增一个配置文件,在配置文件中设置配置信息
from config import Config
from flask import request

app = Flask(__name__)
app.config.from_object(Config)



"""请求上下文"""
class Model(object):
    def __init__(self):
        print("模型接受到数据,num=%s" % request.args.get("username") )

@app.route("/context")
def context():
    Model()
    return "ok"

@app.route("/context2")
def context2():
    Model()
    return "ok"

"""应用上下文"""
from flask import current_app
@app.route('/context3')
def context3():

    # current_app 只是app对象在视图被请求时的一个代理对象[别名对象]
    print( current_app.username ) # 我们可以直接调用app对象所拥有的属性和方法
    return "应用上下文"

from flask import g
class Model2(object):
    def __init__(self):
        print("模型接受到数据,num=%s" % g.username )



@app.route('/context4')
def context4():
    # g是一个临时的全局对象,只会在本次请求中获取到数据
    g.username = request.args.get("username")
    Model2()
    return "应用上下文"

if __name__ == '__main__':
    # app 系统应用对象
    app.username='应用上下文的username'
    print('----运行项目之前----')
    app.run()

安装命令:

pip install flask-script

集成 Flask-Script到flask应用中

from flask import Flask

app = Flask(__name__)

"""使用flask_script启动项目"""
from flask_script import Manager
manage = Manager(app)

@app.route('/')
def index():
    return 'hello world'

if __name__ == "__main__":
    manager.run()

Flask-Script 还可以为当前应用程序添加脚本命令

"""自定义flask_script终端命令"""
from flask_script import Command
class HelloCommand(Command):
    """命令的相关描述"""
    def run(self):
        with open("text.txt","w") as f:
            f.write("hello\r\nhello")
            pass

        print("这是执行了hello命令")

manage.add_command('hello', HelloCommand() )

--结束END--

本文标题: Flask入门很轻松 (二)

本文链接: https://lsjlt.com/news/182573.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Flask入门很轻松 (二)
    转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10959454.html 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接; 在请求...
    99+
    2023-01-31
    入门 轻松 Flask
  • Flask入门很轻松 (一)
    转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10956837.html Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug ...
    99+
    2023-01-31
    入门 轻松 Flask
  • Flask入门很轻松(三)—— 模板
    转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10959471.html Flask内置的模板语言,它的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能。 渲...
    99+
    2023-01-31
    入门 模板 轻松
  • Flask入门
    本文参考博客:https://blog.csdn.net/xiaoyuan511t=1 Flask是轻量级的Web开发框架,只具备基本的核心内容-->视图和路由,其他的功能都需要第三方或者自己手写 建立第一个Flask程序 pip...
    99+
    2023-01-31
    入门 Flask
  • Python Flask入门
    目录主页分析代码:修改视图函数返回值修改URL规则修改视图函数名总结追溯到最初,Flask 诞生于 Armin Ronacher 在 2010 年愚人节开的一个玩笑。后来,它逐渐发展...
    99+
    2024-04-02
  • Flask 入门教程
    Flask 入门教程 一、Flask简单使用 1、准备环境 硬件:Windows 7+python 3.6+安装软件:pycharm安装(社区版)、python环境安装 2、简单的Flask应用 本地...
    99+
    2023-10-07
    flask python 后端
  • flask入门补充
      在上篇文章提到了json的编码问题。那么Flask是国外开发的框架,没有考虑到中文编码,那么我们就需要自己配置   那么在访问页面的时候会有 get 请求和post  请求。在下边我也会提到。以及没有接触过编程的,我会推荐一个软件, ...
    99+
    2023-01-30
    入门 flask
  • Flask简介&入门
    1 了解框架 Flask作为Web框架,它的作用主要是为了开发Web应用程序。那么我们首先来了解下Web应用程序。Web应用程序 (World Wide Web)诞生最初的目的,是为了利用互联网交流工作文档。   1.1 一切从客户端发起...
    99+
    2023-01-31
    入门 简介 Flask
  • JSONP入门:轻松实现跨域请求
    什么是JSONP? JSONP(JSON with Padding)是一种跨域请求技术,利用<script>标签来动态加载外部脚本,并执行返回的JSON数据。它利用浏览器的同源策略例外,允许脚本跨域请求数据,而不受安全限制。...
    99+
    2024-02-28
    JSONP、跨域请求、同源策略
  • Flask入门第三天
      一、数据库操作   1,orm orm(object-Relation Mapping),对象-关系映射,主要实现模型对象到关系数据库数据的映射。 优点: - 只需要面向对象编程, 不需要面向数据库编写代码. - 对数据库的操作...
    99+
    2023-01-31
    门第 Flask
  • Java轻松入门了解File类的使用
    目录概述构造方法基本介绍代码示例常用方法获取文件和目录的基本信息判断功能创建和删除功能目录遍历功能概述 要学习Java中的File类,首先我们要知道,在Java的API中File类的...
    99+
    2024-04-02
  • 轻松入门Java Spring Boot Security:全面指南
    Java Spring Boot Security是一个强大的库,用于在Java Spring Boot应用程序中保护资源。它提供开箱即用的安全性功能,例如身份验证、授权和防伪造请求。在本文中,我们将逐步介绍如何使用Java Spring...
    99+
    2024-02-02
    Spring Boot, Spring Security, Java, Authentication, Authorization
  • Node.js 入门:使用 OAuth 轻松进行认证
    引言 在当今互联世界中,用户期望使用各种应用程序和服务,而无需一遍又一遍地创建和管理凭据。为了满足这一需求,OAuth 协议应运而生,它允许用户通过第三方授权提供商(例如 Google、Facebook 或 Twitter)安全地授权应用...
    99+
    2024-02-19
    Node.js OAuth Express Passport.js 认证
  • Python Flask入门之模板
    目录模板基本语法 编写主页模板 准备虚拟数据 渲染主页模板 总结在一般的 Web 程序里,访问一个地址通常会返回一个包含各类信息的 HTML 页面。因为我们的程序是动态的,页面中的某...
    99+
    2024-04-02
  • PHP Laravel框架:初学者轻松入门指南
    1. 安装环境 在开始学习Laravel框架之前,您需要确保已安装好以下环境: PHP 7.3或更高版本 Composer MySQL或其他兼容的数据库 Web服务器(如Apache或Nginx) Laravel框架(通过Compos...
    99+
    2024-02-06
    PHP Laravel 框架 入门 教程 初学者
  • Node.js PM2 入门指南:轻松管理 Node.js 进程
    自动重新启动:当 Node.js 进程意外崩溃时,PM2 可以自动重启它。 负载均衡:PM2 可以将请求负载平均地分配到多个 Node.js 进程上。 日志管理:PM2 可以将 Node.js 进程的日志集中管理,便于查看和分析。 进程...
    99+
    2024-02-12
    1. 简介 PM2 是一款轻量级 开源且易于使用的进程管理器 它可以帮助您轻松管理 Node.js 进程 PM2 主要具备以下特点:
  • PyTorch入门指南:在PyCharm中轻松安装PyTorch
    PyTorch是当前深度学习领域中备受瞩目的框架之一,它的易用性和灵活性受到很多开发者的喜爱。对于很多新手来说,安装PyTorch可能是一个挑战,尤其是在选择合适的开发环境时。本文将介...
    99+
    2024-02-27
    pytorch pycharm 安装
  • JavaScript基础入门:一步一步,轻松掌握
    JavaScript是一种功能强大的脚本语言,广泛应用于网页开发、移动应用开发和游戏开发等领域。如果你想学习JavaScript,那么本文将为你提供一个系统的入门指南。 1. 了解JavaScript的基本语法 JavaScript是一种...
    99+
    2024-02-08
    JavaScript 编程 入门 语法 基础
  • JavaScript基础学习:全面讲解,轻松入门
    JavaScript是什么? JavaScript是一种脚本语言,它与HTML和CSS一起构成了Web的三大基石。它可以用来创建交互式网页,例如动画、游戏和表单。JavaScript也是一种通用的编程语言,这意味着它可以在各种平台上运行...
    99+
    2024-02-08
    JavaScript 基础 教程 学习 入门 演示代码
  • JSONP 入门:轻松实现跨域数据共享
    JSONP(JSON with Padding)是一种跨域请求数据的技术,它允许浏览器从其他域名的服务器请求数据,并通过回调函数来处理响应数据。与传统的 Ajax 技术相比,JSONP 更加简单易用,不需要复杂的配置和处理跨域错误,因此非...
    99+
    2024-02-24
    JSONP Ajax 跨域 数据共享
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作