初识Flask

第一章

1.1 Hello,Flask!

app.py

from flask import Flask

app = Flask(__name__)


@app.route('/')
def index():
    return '<h1>Hello Flask!</h1>'

1.1.1 创建示例程序

​ 我们安装Flask时,他会在Python解释器中创建一个flask包,我们可以通过flask包的构造文件导入所有开放的类和函数。我们先从flask包中导入Flask类,这个类代表一个Flask程序。实例化这个类,就得到我们的程序实例app:

from flask import Flask
app = Flask(__name__)

​ 传入Flask构造方法的第一个参数是模块或者包的名称,我们应该使用特殊变量 __ name __. __

​ Python会根据所处的模块来赋予 __ name __变量相应的值,对于我们程序来说,这个值为app

1.1.2 注册路由

​ 在一个Web应用中,客户端和服务器上的Flask程序的交互可以简单概括为以下几步:

​ 1)用户在浏览器输入URL访问某个资源

​ 2)Flask接收用户的请求并分析请求的URL

​ 3)为这个URL找到对应的处理函数

​ 4)执行函数并生成响应,返回给浏览器

​ 5)浏览器接收并解析响应,将信息显示在页面中

​ 在上面这些步骤中,大部分由Flask完成。我们需要做的只是建立处理请求的函数,并为其定义对应的URL规则。只需为函数附加app.route()装饰器,并传入URL规则作为参数,我们就可以让URL与函数建立关联。这个过程我们称为注册路由(route),路由负责管理URL和函数之间的映射,而这个函数则被成为视图函数(view function)

  • 路由的含义可以从字面理解,作为动词时,他的含义是“按某路线发送”,即调用与请求URL对应的试图函数。

    在这个程序中,app.route()装饰器把根地址/和index()函数绑定起来,当用户访问这个URL时就会触发index()函数。视图函数index()返回一行问候

    @app.route('/')
    def index():
      return '<h1>Hello, World!</h1>'
    

    route()装饰器的第一个参数是URL规则,用字符串表示,必须以/开始。这里的URL是相对的URL(又称内部URL),即不包含域名的URL,以域名www.baidu.com为例,“/”对应的是根地址,即www.baidu.com,如果把URL规则改为“/hello”,则实际的绝对地址为www.baidu.com/hello

    为视图绑定多个URL

    一个视图函数可以绑定多个URL。比如下面的代码把/hi和/hello都绑定到say_hello()函数上,着就会为say_hello()视图注册两个路由,当用户访问这两个URL中的任意一个,均会触发say_hello()函数

    @app.route('/hi')
    @app.route('/hello')
    def say_hello():
        return '<h1>Hello, Flask!</h1>'
    

    动态函数

    我们不仅可以为视图函数绑定多个URL,还可以在URL规则中添加变量部分,使用“<"变量名>"的形式表示。Flask处理请求时会把变量传入视图函数,所以我们可以添加承诺书获取这个变量值。视图函数greet(),他的URL规则包含一个name变量

    @app.route('/greet/<name>')
    def greet(name):
        return '<h1>Hello, %s!</h1>' % name
    
    

    因为URL中可以包含变量,所以将传入app.route()字符串成为URL规则,而不是URL,Flask会解析请求并把请求的URL与视图函数的URL规则进行匹配。比如,这个greet视图URL规则为/greet/<name>,那么类似greet/foo、greet/bar的请求都会触发这个视图函数

    当URL规则中包含变量时,如果用户访问URL中没有添加变量,比如/greet,那么Flask在匹配失败后会返回一个404错误响应。一个很常见的行为实在app.route()装饰器使用defaults参数设置URL变量的默认值,这个参数接收字典作为输入,存储在URL变量和默认值的映射。在下面的代码中,我们为greet视图新添加了一个app.route()装饰器,为/greet设置了默认的name值:

    @app.route('/greet',defaults={'name':'Programmer'})
    @app.route('/greet/<name>')
    def greet(name):
        return "<h1>Hello, %s</h1>" % name
    

    这时如果用户访问/greet,那么变量name会使用默认值Programmer。视图函数返回<h1>Hello, Programmer!</h1>

    实际效果等同于:

1.2 启动开发服务器

1.2.1 Run,Flask, Run!

​ Flask通过依赖包Click内置了一个CLI(命令行交互界面),当我们安装Flask后,会自动添加一个flask命令脚本,我们可以通过flask命令执行内置命令,扩展提供的命令或者我们自定义的命令。其中flask Run命令用来启动内的开发服务器

  • flask run

    执行flask --help查看所有可用的命令

  • 如果执行flask run命令后显示命令未找到提示(command found)或显示其他错误,可以尝试使用python -m flask run命令尝试解决

    flask run命令运行的开发服务器默认监听http:// 127.0.0.1:5000/地址并开启多线程支持。

    自动发现程序实例

    一般来说,执行flask run命令运行程序前,我们需要提供程序实例所在模块的位置。我们在上面可以直接运行程序,因为Flask会自动探测程序实例,自动探测存在下面这些规则

    • 从当前目录寻找app.py和wsgi.py模块,并从中寻找名为app或application的程序实例。
    • 从环境变量FLASK_APP对应的值寻找名为app或application的程序实例

    因为我们程序主模块命名为app.py,所以flask run命令会自动在其中寻找程序实例。如果你的程序主模块是其他名称,比如hello.py,那么需要设置环境变量FLASK_APP,将包含程序实例的模块名赋值给这个变量,Linux或macOS系统使用export命令:

    export FLASK_APP = hello

    在windows中使用set命令

    set FLASK_APP = hello

    管理环境变量

    创建.env和.flaskenv文件管理环境变量

    • .flaskenv文件用来存储和Flask相关的公共环境变量
    • .env用来存储包含敏感信息的环境变量

    使用方式如下所示:

    SOME_VAR = 1

    这是注释

    FOO='BAR'

1.2.2 更多启动选项

使服务器外部可见

​ 我们在上面启动的Web服务器默认是对外不可见的,可以在run命令后田间 --host 选项将主机地址设为0.0.0.0使其对外可见:

  • flask run --host=0.0.0.0

这会让服务器监听所有外部请求,个人计算机一般没有公网IP,所以,你的程序只能被局域网内的其他用户通过你的个人计算机的内网ip访问,比如,你的内网ip为192.168.31.1,当局域网内的其他用户访问192.168.31.1:5000时,也会看到浏览器显示内容

改变默认端口

Flask提供的Web服务器会默认监听5000端口,你可以在启动时传入参数来改变他:

  • flask run --port=8000

1.2.3 设置运行环境

​ 开发环境:

​ 指我们在本地编写和测试程序时的计算机环境

​ 生产环境 :

​ 网站部署上线供用户访问时的服务器环境

​ 根据运行环境的不同,Flask程序、扩展以及其他程序会改变相应的行为和设置。为了区分程序运行环境,Flask提供了一个FLASK_ENV环境变量用来设置环境,默认为production(生产)。在开发时,我们可以将其设为development(开发),这会开启所有支持开发的特性。为了方便管理,我们将把环境变量FLASK_ENV的值写入.flskenv文件中:

​ FLASK_ENV = development

1.3 项目配置

​ 在很多情况下,你需要设置程序的某些行为,这时你就需要使用配置变量。在Flask中。配置变量就是一些大写形式的Python变量,你也可以称之为配置参数或配置建。使用统一的配置变量可以避免在程序中以硬编码的形式设置程序

​ 加载配置方式一:

app.config['ADMIN_NAME'] = 'Perter'
  • 配置的名称必须是全大写形式,小写的变量将不会被加载、读取

    加载配置方式二:

app.config.update(
    TESTION=True,
    SECRET_KEY = 'sdfrgghjjkh7r'
)

​ 加载配置方式三:从config字典里通过将配置变量的名称作为键读取对应的值

value = app.config['ADMIN_NAME]

1.4 URL与端点

​ 在Web程序中,URL无处不在。如果程序中的URL都是以硬编码的方式写出,那么将会大大降低代码的易用性。比如当你修改了某个路由的URL规则,那么程序里对应的url都要一个个修改,

​ 更好的解决方法是使用Flask使用的url_for()获取URL,当路由中定义的URL规则被修改时,这个函数会返回正确的URl

​ 调用url_for()函数时,第一个参数为端点值。在Flask中,端点用来标记一个视图函数以及对应的URL规则。端点的默认值为视图函数的名称。

​ 例如下面的函数:

@app.route('/')
def index():
    return 'Hello Flask!'

​ 这个路由的端点即视图函数的名称index,调用url_for('index'),即可获取对应的URL,即(‘/’)

  • 在app.route()装饰器中使用endpoint参数可以自定义端点值,不过我们一般不建议这样使用

    如果URL含有动态部分,那么我们需要在url_for()函数中传入相应的参数,以下面的函数为例:

@app.route('/hello/<name>')
def greet(name):
    return 'hello %s!' % name

​ 这时使用url_for('say_hello',name="Jack")得到的URL为‘/hello/Jack’

1.5 Flask命令

​ 除了Flask内置的flask run等命令,我们也可以自定义命令。在虚拟环境安装flask后,包含许多内置命令的flsk就可以使用了。

​ 通过创建一个函数,并为其添加app.cli.command()装饰器,我们就可以注册一个新的命令。如下所示

@app.cli.command()
def hello():
    click.echo('hello, Human!')

​ 函数的名称即为命令名称,这里注册的命令即hello,你可以使用flask hello命令来触发。作为替代,你也可以在app.cli.command()装饰器中传入参数设置命令名称,比如app.cli.command('say-hello')会把命令名称设置为say-hello,完整的命令即flask say-hello

​ 借助click模块的flask --help可以查看Flask提供的命令帮助文档,我们自定义的hello命令也会出现在输出命令列表中

1.6 模板与静态文件

​ 我们需要模板和静态文件来声称更加丰富的网页。模板即包含程序页面的HTML文件,静态文件是需要在HTML文件中加载的CSS和JS文件,以及图片、字体文件等资源文件。默认情况下,模板文件存放在项目根目录中的templates文件夹中,静态文件存放在static文件夹下,这两个文件需要和八平汉程序实例的模块处于同意文件夹下,结构如下:

hello/

  • templates
  • static
  • app.py
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 1.1 搭建开发环境 用pip+virtualenv管理包和虚拟环境 这里个人推荐使用conda环境和包管理工具(...
    i_1312阅读 570评论 0 4
  • Flask主要有两个依赖 是WSGI(Web Server GateWay InterFace, Web服务器的工...
    ArtioL阅读 522评论 0 0
  • 1.1 虚拟环境 1.1.1 为什么需要虚拟环境 学习Flask之前,我们所有的第三方包安装都是直接通过pip i...
    成长之路丶阅读 630评论 0 5
  • 准备工作 1.安装pip和pipenv 2.创建虚拟环境 3.管理依赖 在创建虚拟环境时,如果项目根目录下没有Pi...
    二财_22da阅读 336评论 0 0
  • Flask Web开发实战学习笔记 Flask简介 Flask是使用Python编写的Web微框架。Web框架可以...
    举几个栗子阅读 1,221评论 0 1