草庐IT

1.Flask介绍与环境

三分归元7 2023-04-17 原文

文章目录

1 什么是flask?

Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务,
在介绍Flask之前首先来聊下它和Django的联系以及区别

  • django个大而全的web框架,它内置许多模块,Django功能大而全,Django的一站式解决的思路,能让开发者不用在开发之前就在选择应用的基础设施上花费大量时间。Django有模板,表单,路由,基本的数据库管理等等内建功能
  • flask是一个小而精的轻量级框架,Flask只包含基本的配置,,Flask只是一个内核,默认依赖于2个外部库: Jinja2 模板引擎和 WSGI工具集–Werkzeug , flask的使用特点是基本所有的工具使用都依赖于导入的形式去扩展,flask只保留了web开发的核心功能。

WSGI(web服务器网关接口)是python中用来规定web服务器如何与python Web服务器如何与Python Web程序进行沟通的标准,本质上就是一个socket服务端。而 Werkzeug模块 就是WSGI一个具体的实现

2 为什么要有flask?

flask性能上基本满足一般web开发的需求, 并且灵活性以及可扩展性上要优于其他web框架, 对各种数据库的契合度都非常高

关键词:

  1. 性能基本满足需求
  2. 灵活性可拓展性强
  3. 对各种数据库的契合度都比较高。
  4. 在真实的生产环境下,小项目开发快,大项目设计灵活

3 环境安装

pip安装

pip install Flask

除了Flask包外,同时被安装的还有5个依赖包,它们的主要介绍如表(1-1)所示。

包名及版本功能
Jinja2-2.10渲染模板引擎工具集
MarkupSafe-1.1.0可以识别HTML转义规则。HTML字符转义工具集
Werkzeug-0.14.1Web 框架的底层库,提供了请求及响应以及开发服务器的功能,简称WSGI工具集
click-7.0命令行工具集
itsdangerous-1.1.0加密工具集

4 开始我们的第一个Flask程序


创建成功

项目目录详解:
​ “static文件夹”用于存放各种静态文件 css、js、图片等等

​ “templates文件夹”用于存放html模板文件

​ “app.py”为我们的主文件 ,启动项目需要启动该文件

​ 注意 app.py 文件的名字我们可以自由命名,但是除了flask.py 这种和Flask库相冲突的名字

代码拆分为三部分

第一部分

from flask import Flask

app = Flask(__name__)

导入我们安装好的flask包,通过flask包导入Flask类,Flask类即为Flask的核心,实例化这个Flask类的到一个实例化对象app。

__name__这个特殊的参数:Python会根据所处的模块来赋予__name__变量相应的值,对于我们的程序来说(app.py),这个值为app。

第二部分

@app.route('/')
def hello_world():
    return 'Hello World!'

如果有过对其他web框架的了解,相信看见这个已经看出了一些门道。没错这个 @app.route(‘/’)就是用来匹配url的,在我们的flask里面是以装饰器来实现的,装饰器引用的也是我们上面实例化核心类出来的对象。

那么如果路由下面跟的函数什么呢 ?没错就是我们的视图函数,如果匹配到了路由就会触发我们的视图函数执行,并且return回具体的数据给前端或者移动端。

不是很理解没关系,我们先大概有个印象,会在接下来的章节详细讲解路由以及视图函数的使用

第三部分

if __name__ == '__main__':
    app.run()	

先不管逻辑判断,先看 app.run(), app.run()源码如下去阅读源码不难发现,在内部定义了默认的 ip+端口为127.0.0.1:5000,并且调用了werkzeug.serving为我们创建了一个开发服务器(由依赖包Werkzeug提供),对套接字有一定了解的朋友,其内部就是做了一个循环监听的功能以便交互.

关键词:app.run()实现了flask程序在开发环境下运行起来,并且默认ip和端口是127.0.0.1:5000。

 def run(self, host=None, port=None, debug=None,
            load_dotenv=True, **options):
       
    	 ...
        
         _host ='127.0.0.1'
         _port = 5000
        
         ...
            
         host = host or sn_host or _host
         port = int(port or sn_port or _port)
            
         ...
    
         from werkzeug.serving import run_simple

            try:
                run_simple(host, port, self, **options)
            finally:
                # reset the first request information if the development server
                # reset normally.  This makes it possible to restart the server
                # without reloader and that stuff from an interactive shell.
                self._got_first_request = False

在第三部分中还有一个if判断,那么这个判断的作用是什么呢,有python基础的朋友对这个写法大概不陌生,if逻辑判断时只有本文件为执行文件的时候才会执行,为什么要这么设计呢?因为在开发环境我们是以app.py作为执行文件,但是在真实的生产环境下 ,此文件会作为被调用的文件,并且真实的生成环境不会用到app.run()做监听分配, 原因是性能太低了,

关键词:保证了app.run()只用于开发环境,并且不影响真实的生产环境。

三部分串讲

导入Flask的核心类实例化对象app,然后app作为装饰器使用匹配url分发给下面的视图函数,然后执行该页面会触发app调用run()方法运行起来整个项目。

5Werkzeug简介

Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架,而是一个工具包,官方的介绍说是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等 。
代码示例:

from werkzeug.wrappers import Request, Response

@Request.application
def hello(request):
    return Response('Hello World!')

if __name__ == '__main__':
    from werkzeug.serving import run_simple
    run_simple('localhost', 4000, hello)

看到了这个wekzeug是不是特别像我们的flask代码,没错我们的flask正是依赖于这个werkzeug模块,由wekzeug模块实现了socket服务端的功能,hello必然是加括号运行了,才会执行hello里面的代码,而在我们的flask中app.run()会调用run_simple(host, port, self, **options)把上面代码例子的hello替换成了self也就是app。app()会触发Flask类的__call__方法。

所以所flask程序的入口就在__call__方法中,而__call__方法返回self.wsgi_app(environ, start_response),所以整个程序的执行过程都在 self.wsgi_app(environ, start_response)中.

 #1
 app.run() 调用 werkzeug.serving的run_simple(host, port, self, **options)
 #2
 self()等价于app(), app()调用Flask类的__call__方法
 #3 
 Flask类的__call__方法返回了 self.wsgi_app(environ, start_response)
 # 4 
 flask程序的执行过程都在 self.wsgi_app(environ, start_response)

具体代码:

def run(self, host=None, port=None, debug=None,
            load_dotenv=True, **options):
       
    	 ...
        
         _host ='127.0.0.1'
         _port = 5000
        
         ...
            
         host = host or sn_host or _host
         port = int(port or sn_port or _port)
            
         ...
    
         from werkzeug.serving import run_simple

            try:
                run_simple(host, port, self, **options)
            finally:
                # reset the first request information if the development server
                # reset normally.  This makes it possible to restart the server
                # without reloader and that stuff from an interactive shell.
                self._got_first_request = False
  def __call__(self, environ, start_response):
        """The WSGI server calls the Flask application object as the
        WSGI application. This calls :meth:`wsgi_app` which can be
        wrapped to applying middleware."""
        return self.wsgi_app(environ, start_response)
    ...
    
    def wsgi_app(self, environ, start_response):
        
        ctx = self.request_context(environ)
        error = None
        try:
            try:
                ctx.push()
                response = self.full_dispatch_request()
            except Exception as e:
                error = e
                response = self.handle_exception(e)
            except:
                error = sys.exc_info()[1]
                raise
            return response(environ, start_response)
        finally:
            if self.should_ignore_error(error):
                error = None
            ctx.auto_pop(error)

关键词:

Werkzeug是一个WSGI工具包,本质上是一个socket服务端。
flask基于Werkzeug,flask只保留了web开发的核心功能。
flask的执行过程都在def wsgi_app(self, environ, start_response):中

6运行项目

运行起来我们的flask项目,也可以在app.py直接右键run启动项目
然后访问http://127.0.0.1:5000/

强调以后我们创建flask项目不要用pycharm自带的flask快捷方式创建,上边的快捷创建方式是便于讲解和理解,真实的生产环境更推荐直接创建一个空的python项目

有关1.Flask介绍与环境的更多相关文章

  1. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  2. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  3. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  4. ruby-on-rails - ruby gem如何在rails环境下工作 - 2

    我试图在rails中了解rubygems是如何变得可以自动使用的,而不是在使用required的文件中gem? 最佳答案 这是通过bundler/setup完成的:http://bundler.io/v1.3/bundler_setup.html.它在您的config/boot.rb文件中是必需的。简而言之,它首先将环境变量设置为指向您的Gemfile:ENV['BUNDLE_GEMFILE']||=File.expand_path('../../Gemfile',__FILE__)然后它通过要求bundler/setup将所有ge

  5. ruby-on-rails - 我需要一个真正的 UNIX RoR 开发环境 - 2

    从一开始,我就是一个Windows高手。我从MS-DOS开始。我安装了Windows2.1以及此后的所有Windows。现在,我家里有10台不同的Windows机器在运行,从Windows7Ultimate到各种版本的WindowsServer。我还没有完成Windows8,也不想去那里。我在服务器和各种软件方面都有UNIX经验,但它并不是我的首选环境。但是,我想我正在转换。我试图假装使用Cygwin和MSYS在Windows下运行UNIX。我的目的是搭建一个开发环境。两者都让我失望了。我花了比开发更多的时间来解决一系列技术问题。这是NotAcceptable。到目前为止,我的Ruby

  6. ruby-on-rails - 如果特定语言环境中缺少翻译,如何配置 i18n 以使用 en 语言环境? - 2

    如果特定语言环境中缺少翻译,如何配置i18n以使用en语言环境翻译?当前已插入翻译缺失消息。我正在使用RoR3.1。 最佳答案 找到相似的question这里是答案:#application.rb#railswillfallbacktoconfig.i18n.default_localetranslationconfig.i18n.fallbacks=true#railswillfallbacktoen,nomatterwhatissetasconfig.i18n.default_localeconfig.i18n.fallback

  7. ruby-on-rails - 可移植 Ruby on Rails 环境 - 2

    我给自己买了一个新的8gigUSBkey,我正在寻找一个合适的解决方案来拥有一个可移植RoR环境来学习。我在谷歌上搜索了一下,发现了一些可能性,但我很想听听一些现实生活中的经历和意见。谢谢! 最佳答案 我喜欢InstantRails,非常容易使用,无需安装程序,也不会修改您的系统环境。 关于ruby-on-rails-可移植RubyonRails环境,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/q

  8. ruby-on-rails - 如何通过 URL 更改语言环境? - 2

    在我的双语Rails4应用程序中,我有一个像这样的LocalesController:classLocalesController用户可以通过此表单更改其语言环境:deflocale_switcherform_tagurl_for(:controller=>'locales',:action=>'change_locale'),:method=>'get',:id=>'locale_switcher'doselect_tag'set_locale',options_for_select(LANGUAGES,I18n.locale.to_s)end这有效。但是,目前用户无法通过URL更改

  9. ruby - 从 FaSTLane 将环境变量传递给 shell 脚本 - 2

    我在跑Fastlane(适用于iOS的持续构建工具)以执行用于解密文件的自定义shell脚本。这是命令。sh"./decrypt.shENV['ENCRYPTION_P12']"我想不出将环境变量传递给该脚本的方法。显然,如果我将密码硬编码到脚本中,它就可以正常工作。sh"./decrypt.shmypwd"有什么建议吗? 最佳答案 从直接Shell中扩展假设这里的sh是一个faSTLane命令,它以给定的参数作为脚本文本调用shell命令:#asafastlanedirectivesh'./decrypt.sh"$ENCRYPTI

  10. 【自动驾驶环境感知项目】——基于Paddle3D的点云障碍物检测 - 2

    文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3

随机推荐