1 什么是flask?

Flask 本是作者 Armin Ronacher在2010年4月1日的一个愚人节玩笑 ,不过后来大受欢迎,进而成为一个正式的python编写的web框架
Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务,在介绍Flask之前首先来聊下它和Django的联系以及区别,django个大而全的web框架,它内置许多模块,flask是一个小而精的轻量级框架,Django功能大而全,Flask只包含基本的配置, Django的一站式解决的思路,能让开发者不用在开发之前就在选择应用的基础设施上花费大量时间。Django有模板,表单,路由,基本的数据库管理等等内建功能。与之相反,Flask只是一个内核,默认依赖于2个外部库: Jinja2 模板引擎和 WSGI工具集–Werkzeug , flask的使用特点是基本所有的工具使用都依赖于导入的形式去扩展,flask只保留了web开发的核心功能。

WSGI(web服务器网关接口) 是python中用来规定web服务器如何与python Web服务器如何与Python Web程序进行沟通的标准,本质上就是一个socket服务端。而 Werkzeug模块 就是WSGI一个具体的实现
关键词:一个Python编写微web框架 一个核心两个库( Jinja2 模板引擎 和 WSGI工具集)

2 为什么要有flask?

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

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

3 学前准备:虚拟环境

3.1 虚拟环境是什么?

虚拟环境是隔离的Python解释器环境。通过创建虚拟环境,你可以拥有一个独立的Python解释器环境,相当于对全局的python解释器环境拷贝一份私有的副本, 这样做的好处是可以为每一个项目创建独立的Python解释器环境,因为不同的项目常常会依赖不同版本的库或Python版本。使用虚拟环境可以保持全局Python解释器环境的干净,避免包和版本的混乱,并且可以方便地区分和记录每个项目的依赖,所谓环境追根溯源也是文件,既然是文件就支持拷贝到各个平台上,所以同时提高了可移植性,以便在新环境下复现依赖环境。

举例说明:
例1:如果你同时有很多个项目,有一个爬虫项目,有一个Flask项目,有一个Django项目放在一个环境下,那么管理相关的第三方库难免混乱。
例2:如果你有两个Flask项目,但是两个项目flask版本不一致,会出现版本冲突问题
关键词
1、Python解释器的一个私有副本
2、解决了包管理混乱、版本冲突、提高了移植性

3.2 如何使用虚拟环境?

3.2.1 搭建虚拟环境

windows的开发环境的安装过程,我们使用的是virtualenv虚拟开发环境,首先安装相关包的依赖

pip install virtualenvwrapper-win

利用安装好的模块我们创建一个虚拟环境
注意:这个‘’first_01_env‘’ 是我们自己给虚拟环境取的名字,并且要记录一下图(1)的安装路径,一会我们需要使用。*

mkvirtualenv first_01_env

虚拟环境其他相关命令
01、切换到指定的虚拟环境:注意我们进入虚拟环境是需要用workon命令,但是首次安装成功会自动进入虚拟环境。

workon first_01_env

02、退出虚拟环境

deactivate

03、删除指定的虚拟环境

rmvirtaulenv first_01_env

04、列出所有虚拟环境:

lsvirtualenv

05、进入到虚拟环境所在的目录:

cdvirtualenv

3.2.1 在虚拟环境中安装我们的Flask模块

pip install	flask
Collecting flask
...
Successfully installed Jinja2-2.10 MarkupSafe-1.1.0 Werkzeug-0.14.1 click-7.0 flask-1.0.2 itsdangerous-1.1.0

从上面成功安装的输出内容可以看出,除了Flask包外,同时被安装的还有5个依赖包,它们的主要介绍如表(1-1)所示。

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

首先对这5个库先有一个印象,接下来会在具体的实际应用中应用这些库。
提示:这些库均由Flask团队开发

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

这里我们使用pycharm编辑器来学习Flask,pycharm的安装我们就不重复了。

4.1 创建一个Flask程序

具体操作如图(a)–图(d)
第一步

图(a)
第二步

图(b)
第三步
!注意 如果找不到虚拟环境路径可以参考虚拟环境其他命令

lsvirtualenv         # 列出所有的虚拟环境
workon first_01_env # 切换到指定的虚拟环境
cdvirtualenv # 切换到指定的虚拟环境路径 该目录就是我们所要的路径

​ 图(c)
第四步

图(d)

4.2 解读Flask程序

4.2.1 项目目录详解:

static文件夹”用于存放各种静态文件 css、js、图片等等
templates文件夹”用于存放html模板文件
app.py”为我们的主文件 ,启动项目需要启动该文件
注意 app.py 文件的名字我们可以自由命名,但是除了flask.py 这种和Flask库相冲突的名字

主文件app.py文件代码

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello World!' if __name__ == '__main__':
app.run()

4.2.2 代码拆分为三部分 :

第一部分

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()方法运行起来整个项目。

4.2.2.1 Werkzeug简介

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):

4.2.3 运行项目

运行起来我们的flask项目,见图(2),也可以在app.py直接右键run启动项目

图(2)
然后访问http://127.0.0.1:5000/可以见图(3)

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

4.2.4 详解DEBUG模式

4.3.4.1 DEBUG模式解决了两个问题。
  1. flask代码中如果出现了异常,我们在浏览器中不会提示具体的错误信息,开启debug模式后会把具体的错误信息发送到浏览器上。
  2. flask代码如果被修改了,必须要重启项目修改的代码才会有效,开启debug模式后我们修改了代码只要ctrl+s我们的flask项目就会自动重新加载,不需要手动加载整个网站。
    例1:
    此案例明显出现了一个数组越界的问题
from flask import Flask
app = Flask(__name__) @app.route('/')
def hello():
a = [1,2,3,4]
print(a[4]) return "hello" if __name__ == '__main__':
app.run()

访问如图(4)

图(4)
如图4只提示了服务器内部错误,并没有提示具体的错误原因
好我们为app.run()添加参数改写为app.run(debug=True)

from flask import Flask
app = Flask(__name__) @app.route('/')
def hello():
a = [1,2,3,4]
print(a[4]) return "hello" if __name__ == '__main__':
app.run(debug=True)

再次访问如图(5)

图(5)
我们看到了具体的报错信息 IndexError: list index out of range
并且每次修改代码的时候按下ctrl+s保存一下都会自动重新加载flask项目代码,在此就不做演示了
!强调不要用快捷创建falsk的方式创建项目,就像创建一个普通的python项目一样,或者打开一个空的文件的方式创建,否则debug=True会无效

4.2.4.2 四种开启DEBUG的方式

第一种

from flask import Flask
app = Flask(__name__) @app.route('/')
def hello():
a = [1,2,3,4]
print(a[4])
return "hello" if __name__ == '__main__':
app.run(debug=True) # 设置

第二种

from flask import Flask
app = Flask(__name__)
app.debug = True # 设置 @app.route('/')
def hello():
a = [1,2,3,4]
print(a[4])
return "hello" if __name__ == '__main__':
app.run()

第三种

from flask import Flask
app = Flask(__name__)
app.config.update(DEBUG=True) # 设置 @app.route('/')
def hello():
a = [1,2,3,4]
print(a[4])
return "hello" if __name__ == '__main__':
app.run()

第四种
需要在app.py所在的目录里 再创建一个config.py,随着我们的学习会越来越多的用到这个配置文件,来配置我们的flask项目,注意配置的信息一般为大写。
config.py

DEBUG = True

app.py

from flask import Flask
import config # 导入
app = Flask(__name__) app.config.from_object(config) # 设置 @app.route('/')
def hello():
a = [1,2,3,4]
print(a[4])
return "hello" if __name__ == '__main__':
app.run()

app.config 本质上继承的字典,是字典的子类的一个对象 如图(6)

图(6)

4.2.4.3 DEBUG的PIN码可以在浏览器端调试代码使用(不推荐使用,了解就可以)
* Debugger PIN: 648-906-962

图(7)
可以支持在网页端调试

Flask框架——flask介绍的更多相关文章

  1. flask框架----flask中的wtforms使用

    一.简单介绍flask中的wtforms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 安装: pip3 install wtforms 二.简单使用wtfo ...

  2. flask框架----flask入门

    一.Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...

  3. flask框架----flask基础

    知识点回顾 1.flask依赖wsgi,实现wsgi的模块:wsgiref,werkzeug,uwsgi 2.实例化Flask对象,里面是有参数的 app = Flask(__name__,templ ...

  4. Python: Flask框架简单介绍

    接触Python之后我第一次听说Flask,我就根据自己搜罗的知识尽可能简洁的说出来.如果不准确的地方还请指正,谢谢. Flask是什么?             Flask是基于Python编写的微 ...

  5. Flask框架(一)

    Flask框架 Flask本身想当于一个内核,其自身几乎所有功能都依靠扩展(邮件扩展Flask-Mail.用户认证Flask-Login),都需要用第三方的扩展来实现.其WSGI工具箱采用Werkze ...

  6. 个人技术博客——linux服务器配置以及flask框架

    本次的软件工程实践,我负责我们组后台服务的搭建,我选用了bandwagon的服务器,安装的是Debian GNU/Linux,全程在root用户下操作,后端服务是用python的flask框架,数据库 ...

  7. Flask框架 请求与响应 & 模板语法

    目录 Flask框架 请求与响应 & 模板语法 简单了解Flask框架 Flask 框架 与 Django 框架对比 简单使用Flask提供服务 Flask 中的 Response(响应) F ...

  8. Flask 框架介绍

    FLASK 框架 框架介绍 简单来说: 小 扩展性极强 官方文档 点这里 Flask 和 Django 的区别 Django 无socke,依赖第三方模块wsgi 路由系统(CBV,FBV) 中间件, ...

  9. [Python自学] Flask框架 (1) (Flask介绍、配置、Session、路由、请求和响应、Jinjia2模板语言、视图装饰器)

    oldboy:s9day114 参考博客:https://www.cnblogs.com/wupeiqi/articles/7552008.html 一.Flask简介 1.安装Flask pip i ...

  10. Flask框架(一):介绍与环境搭建

    1.Flask介绍 Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架. Flask 本身相当于一个内核, ...

随机推荐

  1. java接口返回图片链接或pdf链接如何设置在线预览还是下载

    之前文章说到了如何通过将文件转成图片或者pdf来实现在线预览,一般来说在线预览图片或者pdf都是存储在图片服务器上的,在通过接口调用把文件返回给前端,但是把文件返回给前端效果一般是有两种:在线预览和下 ...

  2. [ARM 汇编]进阶篇—存储访问指令—2.3.3 栈操作指令

    栈是一种特殊的数据结构,其特点是后进先出(LIFO,Last In First Out).在 ARM 汇编中,栈通常用于保存函数调用时的寄存器状态.局部变量和返回地址等.本节将详细介绍 ARM 汇编中 ...

  3. midjourney国内版上线! 快来体验一下midjourney的强大功能

    最近大火的midjourney国内版上线了!该网站对接了midjourneyAPI,以文生图.以图生图功能都支持,下面我们来体验一下它的功能. 网址:https://www.weijiwangluo. ...

  4. 自动设置IP地址和自动获取IP地址bat批处理文件

    自动设置IP地址.bat Echo offecho  手动设置IP地址....Netsh interface IP Set Addr "本地连接" Static 192.168.1 ...

  5. [Spring+SpringMVC+Mybatis]框架学习笔记(六):Spring_AspectJ实现AOP

    第6章 Spring_AspectJ实现AOP 6.1 什么是AspectJ 对于AOP的这种编程思想,有很多框架或者组件进行了实现,spring实现AOP就是其中的一种. AspectJ也实现了AO ...

  6. html表格基本标签

    1.<table>表签 <table>...</table>标签用于在html文档中后创建表格.它包含表名和表格本身内容的代码. 2.<tr>标签 &l ...

  7. jQuery事件自动触发

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. mac一键获取最新datagrid 2017.3注册码到剪贴板

    mac一键获取最新datagrid 2017.3注册码到剪贴板 近期datagrid 校验激活码合法性的频率提高,导致需要频繁输入激活码 遂整理一脚本,自动获取最新注册码,并拷贝到剪贴板. 打开dat ...

  9. redux的三个概念与三大核心

    1.什么是redux?一个组件里可能会有很多的状态,比如控制某个内容显示的flag,从后端获取的展示数据,那么这些状态可以在自己的单个页面进行管理,也可以选择别的管理方式,redux就是是一种状态管理 ...

  10. Mybatis框架的搭建和基本使用

    本文总结最原始Mybatis框架的搭建和最基本使用(不涉及Spring框架体系). 1 依赖 首先,我们要引入Mybatis依赖: <dependency> <groupId> ...