Python学习之解析Flask运行原理(图文详解)

本篇文章给大家带来了关于python的相关知识,其中主要介绍了flask的运行原理相关问题,对flask的运行原理做一简要解析,以增强对flask的了解,希望对大家有帮助。

Python学习之解析Flask运行原理(图文详解)

 推荐学习:python学习教程

  所有的 Python Web框架都要遵循 WSGI 协议,在这里还是要简单回顾一下 WSGI 的核心概念。

  WSGI 中有一个非常重要的概念:每个Python Web应用都是一个可调用(callable)的对象。在 flask 中,这个对象就是 app = Flask(name) 创建出来的 app,就是下图中的绿色Application部分。要运行web应用,必须有 web server,比如我们熟悉的apache、nginx,或者python中的gunicorn,我们下面要讲到的werkzeug提供的WSGIServer,它们是下图的黄色Server部分。
这里写图片描述
  Server和Application之间怎么通信,就是WSGI的功能。它规定了 app(environ, start_response) 的接口,server会调用 application,并传给它两个参数:environ 包含了请求的所有信息,start_response 是 application 处理完之后需要调用的函数,参数是状态码、响应头部还有错误信息。

立即学习“Python免费学习笔记(深入)”;

  WSGI application 非常重要的特点是:它是可以嵌套的。换句话说,可以写个application,它做的事情就是调用另外一个 application,然后再返回(类似一个 proxy)。一般来说,嵌套的最后一层是业务应用,中间就是 middleware。这样的好处是,可以解耦业务逻辑和其他功能,比如限流、认证、序列化等都实现成不同的中间层,不同的中间层和业务逻辑是不相关的,可以独立维护;而且用户也可以动态地组合不同的中间层来满足不同的需求。
这里写图片描述
  Flask基于Werkzeug WSGI工具箱和Jinja2 模板引擎。 Flask使用BSD授权。 Flask也被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入这些功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。我们可以这么理解,Flask是一个核心,而其他功能则是一些插件,需要什么功能,只要找到对应的插件,将其插入核心就能够实现该功能了。

  Flask是怎么将代码转换为我们可见的Web网页的。首先,我们得先从Web程序的一般流程来看,对于我们的Web应用来说,当客户端想要获取动态资源 时,(比如ASP和PHP这类语言写的网站),这个时候就会发起一个HTTP请求(比如用浏览器访问一个URL),此时Web应用程序就会在服务器后台进行相应的业务处理(比如对数据库进行操作或是进行一些计算操作等),取出用户需要的数据,生成相应的HTTP响应(当然,如果访问的是 静态资源 ,服务器则会直接返回用户所需的资源,不会进行业务处理)。整个处理工程如下所示:
这里写图片描述
  在实际的应用中,不同的请求可能会调用相同的处理逻辑。这里有着相同业务处理逻辑的HTTP请求可以用一类URL来标识。比如在我们的博客站点中,对于所有想要获取Articles内容的请求而言,可以用 articles/这类URL来表示,这里的article_id用以区分不同的article。接着在后台定义一个get_article(article_id)的函数,用来获取article相应的数据,此外还需要建立URL和函数之间的一一对应关系。这就是Web开发中所谓的路由分发 ,如下图所示:
这里写图片描述
  在Flask中,使用werkzeug来做路由分发,werkzeug是Flask使用的底层WSGI库(WSGI,全称 Web Server Gateway interface,或者 Python Web Server Gateway Interface,是为 Python 语言定义的Web服务器和Web应用程序之间的一种简单而通用的接口)。
  WSGI将Web服务分成两个部分:服务器和应用程序。WGSI服务器只负责与网络相关的两件事:接收浏览器的HTTP请求、向浏览器发送HTTP应答;而对HTTP请求的具体处理逻辑,则通过调用WSGI应用程序进行。WSGI工作流程如下图所示:
这里写图片描述
  在Flask中,路由分发的代码写起来十分简单,如下:

# 管理员注销页面@main.route('/logout')def logout():    dm = DataManager()    currentUsers = dm.getUsers('0')    print(currentUsers[0])    return render_template('currentUsers.html', users=currentUsers)

登录后复制

  通过业务逻辑函数获得我们所需的数据后,服务器将会根据这些数据来生成HTTP响应(对于Web应用来说,一般就是一个HTML文件,这个是可以直接被我们的客户端,即浏览器直接读取并解释的)。在Web开发中,常规的做法是将获取的数据传入Web应用提供的一个HTML模板文件中,经过模板系统的渲染后最终得到我们所需要的HTML响应文件。
  一般情况下,虽然请求不同,但是响应中的数据的展示方式是相同的 ,通俗点说就是除了我们请求获得的数据不一样外,其他都是一样的,那么我们就可以设计一个模板(除了数据内容可以改动,其他都是固定的HTML文件)。我们以博客站点为例,对不同article而言,其具体article content虽然不同,但页面展示的内容除了请求的数据外都是一样的,都有标题拦,内容栏等。也就是说,对于article来说,我们只需提供一个HTML模板,然后传入不同article数据,即可得到不同的HTTP响应。这就是所谓的模板渲染 ,如下图所示:
这里写图片描述
  在Flask中使用Jinja2模板渲染引擎来做模板渲染(Jinja2是基于python的模板引擎,功能比较类似于于PHP的smarty,J2ee的Freemarker和velocity。它能完全支持unicode,并具有集成的沙箱执行环境,应用广泛。jinja2使用BSD授权)。Jinja2的工作流程如下图所示:
这里写图片描述
  在Flask中,模板渲染的代码写起来也是十分的便捷,代码如下:

@app.route('/articles//') defget_article(article_id):returnrender_template('path/to/template.html', data_needed)

登录后复制

  在Flask中,我们处理一个请求的流程就是,首先根据用户提交的URL来决定由哪个业务逻辑函数来处理,然后在函数中进行操作,取得所需的数据。再将取得的数据传给相应的模板文件中,由Jinja2负责渲染得到HTTP响应内容,即HTTP响应的HTML文件,然后由Flask返回响应内容。
  下面主要以实例项目对Flask运行原理做一简要解析。在实例项目中,使用到了程序工厂函数和蓝本。项目目录结构如下:
这里写图片描述
  在manager.py文件中,定义了项目启动的入口函数:

# 确保服务器只会在该脚本被 Python 解释器直接执行的时候才会运行,而不是作为模块导入的时候。if __name__ == '__main__':    # 启用cmd命令行    # manager.run()    app.run(host='0.0.0.0', port=9000, debug=True)

登录后复制

同时,在该文件中创建了工厂方法实例:

app = create_app()

登录后复制

  在工程方法中,对数据库进行了相关配置,创建了前端导航栏,同时对所创建的蓝本进行了注册。在创建的蓝本中主要涉及授权、路由及错误处理模块。

# 构造工厂方法def create_app():    # 在这里__name__ == __main__    app = Flask(__name__)    app.url_map.converters['regex'] = RegexConverter    # 防止跨站攻击 注:为了增强安全性,密钥不应直接写入代码,而应该保存在环境变量中    # app.config['SECRET_KEY'] = 'hard to guess string SUNNY2017'    # app.secret_key = 'Sunny123456'    # flask提供的读取外部文件    app.config.from_pyfile('config')    # basedir = os.path.abspath(os.path.dirname(__file__))    # print(basedir)    # 配置数据库连接    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://lmapp:lmapp@localhost/smp'    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True    nav.register_element('top', Navbar(u'APP安盾',                                       View(u'当前在线', 'main.index'),                                       View(u'全部用户', 'main.all_users'),                                       View(u'注销', 'main.logout'),                                       View(u'修改密码', 'main.chgpwd'),                                       ))    nav.init_app(app)    db.init_app(app)    bootstrap.init_app(app)    # init_views(app)    from .auth import auth as auth_blueprint    from .main import main as main_blueprint    # 注册蓝本 url_prefix='/auth'    app.register_blueprint(auth_blueprint,)    app.register_blueprint(main_blueprint, static_folder='static')    return app

登录后复制

 推荐学习:python教程

以上就是Python学习之解析Flask运行原理(图文详解)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2245280.html

(0)
上一篇 2025年2月26日 21:45:40
下一篇 2025年2月18日 04:40:52

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 带你一起解读Python多线程

    本篇文章给大家带来了关于python的相关知识,其中主要介绍了关于多线程的相关知识,多线程类似于同时执行多个不同的程序,有很多的优点,下面我们就来看一下,希望对大家有帮助。  推荐学习:python教程 线程讲解   多线程类似于同时执行多…

    2025年2月26日 编程技术
    200
  • 一起来分析Python函数式编程

    本篇文章给大家带来了关于python的相关知识,其中主要介绍了函数式编程的相关问题,也就是在命令式范式中,通过为计算机提供一系列指令然后执行它们来完成任务,希望对大家有帮助。  推荐学习:python学习教程 在这篇文章里,你将学会什么是函…

    2025年2月26日 编程技术
    200
  • Python数据异常值检测和处理(实例详解)

    本篇文章给大家带来了关于python的相关知识,其中主要介绍了数据分析中异常值的相关问题,一般异常值的检测方法有基于统计的方法,基于聚类的方法,以及一些专门检测异常值的方法等,下面对这些方法进行相关的介绍,希望对大家有帮助。  推荐学习:p…

    2025年2月26日 编程技术
    200
  • 归纳整理!Python实用技巧总结

    本篇文章给大家带来了关于python的相关知识,其中主要总结了24个非常实用的python开发技巧,包括了all or any、bashplotlib、collections等等,希望对大家有帮助。 推荐学习:python教程 在Pytho…

    2025年2月26日
    200
  • 经典技巧之Python案例详解

    本篇文章给大家带来了关于python的相关知识,其中主要总结介绍了一些经典案例,希望大家都能够学会,能够给大家带来帮助。 推荐学习:python教程 今天给大家搜集了几道Python的经典案例,希望各位都能学会! 一、猜数字 立即学习“Py…

    2025年2月26日 编程技术
    200
  • python列表和元组详解(实例详解)

    本篇文章给大家带来了关于python的相关知识,其中主要介绍了列表和元组的相关问题,可以使用灵活的列表(list)和元组(tuple),来进行数据储存,下面我们先简单了解下列表和元组的基本使用,希望对大家有帮助。 推荐学习:python学习…

    2025年2月26日
    200
  • 归纳整理三十个Python的实用技巧

    本篇文章给大家带来了关于python的相关知识,其中主要总结了一些编程过程中常用到的使用技巧,包括了检查对象、使用多行字符串、从函数中返回多个值等等相关内容,希望对大家有帮助。  推荐学习:python教程 技巧1 就地交换两个数字 Pyt…

    2025年2月26日
    200
  • Python魔法函数学习之__missing__

    本篇文章给大家带来了关于python的相关知识,其中主要介绍了“__missing__()”函数的相关问题,下面我们就一起来看一下这个魔法函数,希望对大家有帮助。 推荐学习:python学习教程 1、有点价值的__missing__() 从…

    2025年2月26日 编程技术
    200
  • 实例详解Python元组

    本篇文章给大家带来了关于python的相关知识,其中主要介绍了关于元组的相关问题,包括了元组的创建、访问、修改、删除和内置方法等,希望对大家有帮助。 推荐学习:python教程 引言——在Python中,通过数据结构来保存项目中重要的数据信…

    2025年2月26日 编程技术
    200
  • 实例详解python之requests模块

    本篇文章给大家带来了关于python的相关知识,其中主要介绍了requests模块的相关问题,requests模块是一个用于网络请求的模块,主要用来模拟浏览器发请求,希望对大家有帮助。 推荐学习:python学习教程 Requests模块是…

    2025年2月26日
    200

发表回复

登录后才能评论