个人档案Python顶尖明星WEB框架Flask

个人档案Python顶尖明星WEB框架Flask

Flask简介

Flask是一个争持于Django而言轻量级的Web框架。

和Django大包大揽不同,Flask建立于一多元的开源软件包之上,这其间
最重要的是WSGI应用开发库Werkzeug和模板引擎Jinja:

个人档案 1 个人档案 2

策略 :werkzeug和Jinja这五个库和Flask一样,都是pocoo团队开支的。这或许反映了pocoo与Django竞争时有关生态的一种政策,那种策略的自然
延伸是Flask框架中并未包含数据库方面的预制构件,无论ORM依旧其他。

关爱点 :Flask是一个WSGI应用框架,那意味我们开展Flask开发时,不需要
关注网络方面的操作,Flask应用的进口是包装过的网络请求包,出口是
网络响应,大家仅需要关怀这些等级内的拍卖逻辑。

WSGI服务器
:Flask即便内置了简易的WSGI服务器,但其特性仅仅适用于开发期的调节。
Flask官网推荐了多种WSGI服务器,实现形式从多进程到多线程到协程,
这方面的挑三拣四我们在本学科将官不关乎。

REST适应性
:即使Flask和Django一样,最初的角度都是服务端的动态网页应用。但
Flask的筹划使之也一定适用于面向资源的REST架构,在一发移动化
并且单页应用越来越重要的WEB开发领域,这是Flask绝对于Django异常大的优势。

本文内容转自 汇智网。

Hello Flask

编写一个基于Flask的hello world非常容易:

1、导入Flask类

from flask import Flask

Flask类是Flask框架的中坚类,它实现了WSGI应用规范。

2、创建Flask实例

app = Flask(__name__)

Flask构造函数的率先个参数指定一个引入名/importname。Flask框架
使用这么些名字举办静态资源、模板、错误消息的永恒。除非你知道的领悟它的
功用,平常状态下,我们总应该利用特殊变量
_name**。

Flask实例是可调用的(具有call模式),这多少个实例可以直接对接
WSGI服务器。

3、注册路由

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

注册路由就是起家URL规则和处理函数之间的涉嫌。Flask框架依赖于路由
完成HTTP请求的散发。

路由中的函数被叫作视图函数,其重临值将用作HTTP响应的正文内容。

4、对接并启动WSGI服务器

Flask封装了一个简易的开发用WSGI服务器,大家可以透过调用run()启动服务器运行:

app.run(host='0.0.0.0',port=80)

概述

路由是MVC架构的Web框架中出色关键的一个概念,也是本节科目标关键。

顾名思意,路由就是在白蒙蒙中找出一条路的意味。在Flask框架中,路由就表示为用户请求的URL找出其对应的处理函数之意。

个人档案 3

在本节课程,我们将重点从以下多少个地点讲解Flask框架中的路由:

何以为利用注册路由? 如何为路由指定其辅助的HTTP方法? 咋样配合动态URL?
怎么着对URL中的变量类型举办过滤? 如何知道访问点/endpoint?
怎么样为运用设定静态路由? 怎样防止硬编码指向任何视图的URL?

注册路由

在Flask应用中,路由是指用户请求的URL与视图函数之间的映射。Flask框架
依据HTTP请求的URL在路由表中匹配预定义的URL规则,找到相应的视图函数,
并将视图函数的举行结果回到WSGI服务器:

个人档案 4

看得出路由表在Flask应用中处于一定要旨的职务。路由表的始末是由使用开发者填充。

route装饰器 :可以应用Flask应用实例的route装饰器将一个URL规则绑定到
一个视图函数上。

例如,下面的演示将URL规则/test绑定到视图函数test()上:

1
2
3
@app.route('/test')
def test():
    return 'this is response'

假若这些动用部署在主机ezhost.com的根目录下,那么当用户访问:

http://ezhost.com/teset

Flask框架就会调用我们的test()函数,其回来结果就传递给WSGI服务器发送给访问者。

add_url_rule():另一种等价的写法是采纳Flask应用实例的add_url_route()方法。
上面的示范注册了一个与前例相同的路由:

def test():
    return 'this is response'
app.add_url_route('/test',view_func=test)

事实上,route装饰器内部也是经过调用add_url_route()方法实现的路由注册。
可是众所周知,使用装饰器使代码看起来更优雅一些。

为路由指定HTTP方法

默认情状下,Flask路由仅协助HTTP的GET请求。可以拔取methods关键字参数,在登记
路由时显式地宣称视图方法帮忙的HTTP方法。

诸如,下边的演示将URL规则/auth绑定到视图函数v_auth(),这么些路由仅补助POST方法:指定多种HTTP方法帮忙

@app.route('/auth',methods=['POST'])
def v_auth():pass

要害字参数methods的档次为list,由此得以同时指定多种HTTP方法。

下边的示范中,使URL规则/user同时帮助POST方法和GET方法:

个人档案 5

@app.route('/user',methods=['POST','GET'])
def v_users():
    if request.method == 'GET':
        return ... # 返回用户列表
    if request.method == 'POST'
        return ... #创建新用户

个人档案 6

本条特性使Flask十分便于开发REST架构的后台服务,而不仅局限于传统的动态网页。

匹配动态URL

奇迹我们需要将同一类URL映射到同一个视图函数处理,比如,使用同一个视图函数
来显示不同用户的个人档案。我们希望以下的URL都得以分发到同一个视图函数:

个人档案 7

在Flask中,能够将URL中的可变部分使用一对小括号<>注解为变量,
并为视图函数注解同名的参数:

@app.route('/user/<uname>')
def v_user(uname):
    return '%s\'s Profile' % uname
</uname>

在上头的示范中,URL规则中的<uname>表示这有些是可变的,Flask将领到用户请求的
URL中这部分的始末,并视作视图函数v_user()的uname参数进行调用。

URL变量类型过滤

考虑下边的言传身教,我们希望经过HTTP共享文件夹/var/readonly中的文件:

个人档案 8

/var
    /readonly
        /a.txt
        /b.txt
        /repo
           /c.txt
           /d.txt

个人档案 9

概括思维一下就有答案了。我们得以协会URL规则/file/<fname>,然后径直
读取文件内容重返给用户。注册如下的路由:

个人档案 10

@app.route('/file/<fname>')
def v_file(fname):
    fullname = os.path.join('/var/readonly',fname)
    f = open(fullname)
    cnt =  f.read()
    f.close()
    return cnt
</fname>

个人档案 11

测试结果注脚,/file/a.txt和/file/b.txt都没有问题,可是/file/repo/c.txt和
/file/repo/d.txt却会破产。

这是因为,默认意况下,在URL规则中的变量被视为不分包/的字符串。/file/repo/c.txt
是绝非艺术匹配URL规则/file/<fname>的。

能够利用内置的path转换器告诉Flask框架改变这一默认行为。path转换器允许
规则卓殊包含/的字符串:

@app.route('/file/<path:fname>')
</path:fname>

在Flask中,转换器/converter用来对从URL中提取的变量举办预处理,这个历程
发生在调用视图函数从前。Flask预置了四种转换器:

  1. string – 匹配不分包/的字符串,这是默认的转换器
  2. path – 匹配包含/的字符串
  3. int – 唯有当URL中的变量是整型值时才匹配,并将变量转换为整型
  4. float – 唯有当URL中的变量是浮点值时才匹配,并将变量转换为浮点型

访问点/endpoint

我们直接强调,路由的法力是依照请求的URL,找到相应的视图函数。这没错,但是在
Flask框架中,请求任务的散发并不是平素从用户请求的URL一步定位到视图函数,
两者之间隔着一个造访点/endpoint。

以下边的代码为例,大家看Flask怎么样实现请求的分发:

@app.route('/home')
def home():pass

在Flask内部拔取两张表维护路由:

  • url_map :维护URL规则和endpoint的映射
  • view_functions :维护endpoint和视图函数的映照。

以用户访问URL/home为例,Flask将第一选用url_map找到所请求URL对应的
endpoint,即访问点home,然后再拔取view_functions表查找home这个访问点
对应的视图函数,最后匹配到函数home():

个人档案 12

默认访问点 :当大家利用route装饰器注册路由时,默认使用被点缀函数的
函数名(name)作为访问点,由此,你见到上边的表中,路由中的访问点为home。

自定义访问点
:可以在利用route装饰器或调用add_url_rule()方法注册路由时,使用
endpoint关键字参数改变这一默认行为:

@app.route('/home',endpoint='whocare')
def home():pass

这时候的两张路由表将变成这样:

个人档案 13

静态目录路由

当成立应用实例时,Flask将电动添加一条静态目录路由,其访问点
始终被装置为static,URL规则默认被设置为/static,本地路径默认被
设置为使用文本夹下的static子文件夹:

+————————————————————+

| url rule          | endpoint    | view_function           |

+————————————————————+

| /static           | static         | Flask.send_static_file |

+————————————————————+

一经你的利用目录如下:

/app
    /web.py
    /static
        /main.css
        /jquery.min.js   

那么启动应用后就可以经过URL/static/main.css访问static文件夹下的main.css了。

除却访问点被定位为static,静态目录的URL规则和地点目录都是足以按照使用意况开展调整。

变更默认的地方路径
:可以在创造应用对象时采取重要字参数static_folder改变
默认的静态文件夹。例如,你的静态文件都存放在应用下的assets目录下,
那么可以按如下的点子创造应用对象:

app = Flask(name,static_folder=’assets’) 也得以行使一个相对路径:

app = Flask(name,static_folder=’/var/www/static’)
改变默认的地点路径并不会对路由表暴发潜移默化。

变更默认的URL规则 : 假使不希罕静态目录URL/static,也得以在创立应用
对象时行使紧要字参数static_url_path换一个其它名字。

上面的示范中,将采纳下的assets文件夹注册为静态目录/assets:

app =
Flask(个人档案,name,static_folder=’assets’,static_url_path=’/assets’)
当应用运行后,通过URL/assets/main.css就足以访问assets文件夹下的
main.css文件了。

那时的路由表变化为:

+————————————————————+

| url           | endpoint           | view_function           |

+————————————————————+

| /assets     | static                |Flask.send_static_file |

+————————————————————+

构造URL

在一个实用的视图中,不可避免地存在指向任何视图的链接。在头里的教程示例中,我们都是在视图函数中这样硬编码这几个链接URL的:

@app.route('/')
def v_index():
    return '<a href="/tech">tech</a>'
@app.route('/tech') 
def v_tech():pass

 

大多数情景下这种硬编码URL是可以干活的。但若是这个动用被挂在WSGI服务器的一个
子路径下,比如:/app1,那么用户访问URL/tech是不会马到成功的,这时应当走访/app1/tech
才可以正确地路由到视图函数v_tech()。

咱俩应该选用访问点让Flask框架帮大家总结链接URL。简单地给url_for()函数传入
一个访问点,它回到将是一个保险的URL地址:

个人档案 14

@app.route('/')
def v_index():
    print url_for('v_contacts')  # /contact
    return 'see console output!'
@app.route('/contact')
def v_contacts():pass

个人档案 15

 

丰裕询问参数 :
使用紧要字参数,能够在协会的URL中变化查询串。下边的调用将生成
/contact?format=json

个人档案 16

@app.route('/')
def v_index():
    print url_for('v_contacts',format='json')
    return  ''
@app.route('/contact')     
def v_contacts():pass

个人档案 17

 

添加URL变量 :
假设指定访问点对应的视图函数接收参数,那么重要字参数将转移对应的参数URL。上面的
示例将生成/contact/朱莉娅?format=html:

个人档案 18

@app.route('/')
def v_index():
    print url_for('v_contact',name='Julia',format='html')
    return ''
@app.route('/contact/<name>')
def v_contact(name):pass
</name>

个人档案 19

 

添加锚点
:使用_anchor关键字可以为转变的URL添加锚点。下边的示范将生成URL
/contact#part2

@app.route('/')
def v_index():
    print url_for('v_contacts',_anchor='part2')
@app.route('/contact')
def v_contacts():pass

 

外部URL :
默认情况下,url_for()生成站内URL,能够安装紧要字参数_external
为True,生成包含站点地址的外表URL。下边的演示将生成URLhttp://&lt;x.y.z&gt;/contacts:

@app.route('/')
def v_index():
    print url_for('v_contacts',_external=True)
@app.route('/contact')
def v_contacts():pass

 

admin

网站地图xml地图