flask flask框架中文文档

Flask简介

Flask是一个相对于Django的轻量级Web框架。

与Django不同,Flask建立在一系列开源软件包之上,其中最重要的是WSGI应用开发库Werkzeug和模板引擎Jinja:

flask flask框架中文文档

策略:werkzeug和金甲和Flask一样,都是pocoo团队开发的。这可能反映了pocoo与Django竞争时的一种关于生态的策略。这种策略的自然延伸是Flask框架不包含数据库组件,无论是ORM还是其他。

注意:Flask是一个WSGI应用框架,也就是说我们在开发Flask的时候,不需要关注网络操作。Flask应用的入口是封装的网络请求包,出口是网络响应。我们只需要关注这个阶段的处理逻辑。

WSGI服务器:虽然Flask内置了一个简单的WSGI服务器,但是它的性能只适合开发过程中的调试。Flask官网推荐了多种WSGI服务器,实现方式从多进程到多线程再到并发,我们在本课程中不涉及选择。

REST适应性:虽然Flask和Django一样,但是最初的出发点是服务器端的动态web应用。但Flask的设计使其适合面向资源的REST架构,这是Flask在移动性越来越强、单页面应用越来越重要的WEB开发领域相对Django的一个相当大的优势。

这里我推荐一个学习flask的教程,这篇文章的内容也是转自这个教程。

你好烧瓶

基于Flask编写hello world相当容易:

1.导入Flask类

从flask导入FlaskFlask是Flask框架的核心类,实现了WSGI应用规范。

2.创建一个烧瓶实例

app = flash (_ _ name _ _) flash构造函数的第一个参数指定导入名称/importname。Flask框架使用这个名称来定位静态资源、模板和错误消息。除非你清楚地了解它的功能,否则我们通常应该使用特殊变量_name。

Flask实例是可调用的(使用call方法),该实例可以直接与WSGI服务器接口。

3.登记路线

@ route(& # 39;/')def index():return & # 39;你好,弗拉斯克!'注册路由是为了建立URL规则和处理函数之间的关联。Flask框架依靠路由来完成HTTP请求的分发。

路由中的函数称为view函数,它的返回值将是HTTP响应的正文内容。

4.停靠并启动WSGI服务器。

Flask封装了一个简单的用于开发的WSGI服务器。我们可以通过调用run()来启动服务器:

app . run(host = & # 39;0.0.0.0',port=80)概述路由是MVC架构的Web框架中非常重要的概念,也是本课程的重点。

顾名思义,路由就是找到一条走出困惑的路。Flask框架中的路由意味着为用户请求的URL找到相应的处理函数。

在本课中,我们将主要从以下几个方面来解释Flask框架中的路由:

如何为应用程序注册路线?如何指定路由支持的HTTP方法?如何匹配一个动态URL?如何过滤URL中的变量类型?如何理解接入点/端点?如何为一个应用设置静态路由?如何避免硬编码URL指向其他视图?

注册路由

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

可以看出,路由表在Flask应用中处于非常核心的地位。路由表的内容由应用程序开发人员填写。

Route decorator:您可以使用Flask应用程序实例的route decorator将一个URL规则绑定到一个视图函数。

例如,以下示例将URL规则/测试绑定到视图函数test():

@ app . route(& # 39;/test & # 39;)def test():return & # 39;这是回应& # 39;如果此应用程序部署在主机ezhost.com的根目录中,则当用户访问:

Http://ezhost.com/tesetFlask框架将调用我们的test()函数,返回的结果将被传递给WSGI服务器并发送给访问者。

Add_url_rule():另一个等价的编写方法是使用Flask应用程序实例的add_url_route()方法。以下示例注册了与上一示例相同的路由:

def test():return & # 39;这是回应& # 39;app . add _ URL _ route(& # 39;/test & # 39;,view_func=test)其实路由装饰器也是通过调用add_url_route()方法内部注册的。但是很明显,使用decorators让代码看起来更优雅。

为路由指定HTTP方法

默认情况下,Flask路由只支持HTTP GET请求。注册路由时,可以使用methods关键字参数显式声明view方法支持的HTTP方法。

例如,以下示例将URL规则/auth绑定到视图函数v_auth(),该函数仅支持POST方法:

@ app . route(& # 39;/auth & # 39;,方法=[& # 39;邮政& # 39;])def v_auth():pass指定支持多个HTTP方法。

关键字参数methods的类型是list,因此可以同时指定多个HTTP方法。

在以下示例中,URL规则/用户支持POST方法和GET方法:

@ app . route(& # 39;/用户& # 39;,方法=[& # 39;邮政& # 39;,'获取& # 39;])def v _ users():if request . method = = & # 39;获取& # 39;:返回…#返回用户列表,如果request.method = = & # 39邮政& # 39;返回…#创建新用户的特性使得Flask非常容易开发REST架构的后台服务,不局限于传统的动态网页。

匹配动态URL

有时候我们需要把同类的URL映射到同一个视图函数,比如用同一个视图函数来显示不同用户的个人文件。我们希望以下URL可以全部分配给同一个视图功能:

在Flask中,可以使用一对括号

@ app . route(& # 39;/user/& lt;uname & gt')def v _ user(uname):return & # 39;% s \ & # 39■个人资料& # 39;% uname & lt/uname & gt;在上面的例子中,

URL变量类型过滤

考虑以下示例,我们希望通过HTTP共享/var/readonly文件夹中的文件:

/var/readonly/a . txt/b . txt/repo/c . txt/d . txt,想想就有答案了。我们可以构造URL规则/文件/

@ app . route(& # 39;/file/& lt;fname & gt')def v _ file(fname):full name = OS . path . join(& # 39;/var/readonly & # 39;,fname)f = open(full name)CNT = f . read()f . close()return CNT & lt;/fname & gt;测试结果显示/file/a.txt和/file/b.txt没有问题,但是/file/repo/c.txt和/file/repo/d.txt会失败。

这是因为,默认情况下,URL规则中的变量被视为不包含/的字符串。/file/repo/c.txt无法匹配URL规则/file/

您可以使用内置的路径转换器来告诉Flask框架改变这个默认行为。路径转换器允许规则匹配包含/:

@ app . route(& # 39;/file/& lt;路径:fname & gt')& lt/path:fname & gt;在Flask中,转换器/converter用于预处理从URL中提取的变量,这发生在调用view函数之前。Flask预设了四个转换器:

string – 匹配不包含/的字符串,这是默认的转换器path – 匹配包含/的字符串int – 只有当URL中的变量是整型值时才匹配,并将变量转换为整型float – 只有当URL中的变量是浮点值时才匹配,并将变量转换为浮点型访问点/endpoint

我们一直强调路由的作用是根据请求的URL找到对应的查看函数。确实如此,但是在Flask框架中,请求任务的分发并不是直接从用户请求的URL一步到位到view函数,两者之间有一个接入点/端点。

以下面的代码为例,我们来看看Flask是如何实现请求的分发的:

@ app . route(& # 39;/home & # 39;)def home():pass使用两个表来维护Flask内部的路由:

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

以用户访问URL/home为例,Flask会先用url_map找到请求URL对应的端点,也就是接入点home,再用view_functions表找到接入点home对应的view函数,最后匹配函数home():

默认访问点:当我们用Route Decorator注册一个路由时,我们默认使用被修饰函数的函数名作为访问点。因此,正如您在上表中看到的,路由中的接入点是home。

自定义访问点:当使用路由装饰器或调用add_url_rule()方法来注册路由时,可以使用endpoint关键字参数来更改此默认行为:

@ app . route(& # 39;/home & # 39;,端点= & # 39;谁在乎& # 39;)def home():此时传递的两个路由表会是这样的:

静态目录路由

创建应用程序实例时,Flask会自动添加一个静态目录路由,其访问点始终设置为静态,URL规则默认设置为/static,本地路径默认设置为应用程序文件夹下的静态子文件夹:

+ – + | url规则|端点| view _ function | |/static | static | flask . send _ static _ file |+-+如果您

/app/web . py/static/main.css/jquery . min . js然后启动应用程序后,就可以通过URL/static/main.css访问静态文件夹中的main . CSS了..

除了接入点固定为静态,静态目录和本地目录的URL规则可以根据应用情况进行调整。

更改默认的本地路径:创建应用程序对象时,可以使用关键字参数static_folder来更改默认的静态文件夹。例如,如果您的静态文件存储在应用程序下的assets目录中,您可以创建一个应用程序对象,如下所示:

app = Flask(name,static _ folder = & # 39资产& # 39;)也可以使用绝对路径:

app = Flask(name,static _ folder = & # 39/var/www/static & # 39;更改默认本地路径不会影响路由表。

更改默认URL规则:如果不喜欢静态目录URL/static,也可以在创建应用对象时使用关键字参数static_url_path更改另一个名称。

在以下示例中,应用程序下的assets文件夹注册为静态目录/assets:

app = Flask(name,static _ folder = & # 39资产& # 39;,static _ url _ path = & # 39/资产& # 39;应用程序运行后,您可以通过URL/assets/main.css访问assets文件夹中的main.css文件。

此时,路由表变为:

++ | URL | endpoint | view _ function | |/assets | static | flask . send _ static _ file |+-+

构造URL

从实际观点来看,不可避免地会与其他观点相联系。在上一课的示例中,我们都像这样在视图函数中硬编码了这些链接URL:

@ app . route(& # 39;/')def v _ index():return & # 39;& lta href = & # 34/tech & # 34;& gttech & lt/a & gt;'@ app . route(& # 39;/tech & # 39;)def v_tech():传递这种硬编码的URL在大多数情况下都是有效的。但是如果这个应用挂在WSGI server的一个子路径中,比如:/app1,那么用户对URL/tech的访问就不会成功,然后应该访问/app1/tech才能正确路由到视图函数v_tech()。

我们应该使用访问点让Flask框架为我们计算链接URL。只需向url_for()函数传递一个访问点,它就会返回一个可靠的url地址:

@ app . route(& # 39;/')def v _ index():print URL _ for(& # 39;v _ contacts & # 39)#/联系返回& # 39;参见控制台输出!'@ app . route(& # 39;/联系& # 39;)def v_contacts():pass添加查询参数:使用关键字参数,可以在构造的URL中生成查询字符串。下面的调用会产生/联系?format=json

@ app . route(& # 39;/')def v _ index():print URL _ for(& # 39;v _ contacts & # 39,格式= & # 39;json & # 39)返回& # 39;'@ app . route(& # 39;/联系& # 39;)def v_contacts():pass Add URL变量:如果指定接入点对应的view函数接收到参数,关键字参数会生成对应的参数URL。下面的例子会生成/contact/Julia?格式=html:

@ app . route(& # 39;/')def v _ index():print URL _ for(& # 39;v _ contact & # 39,name = & # 39朱莉娅& # 39;,格式= & # 39;html & # 39)返回& # 39;'@ app . route(& # 39;/contact/& lt;名称& gt')def v _ contact(name):pass & lt;/name & gt;添加锚点:使用_anchor关键字向生成的URL添加锚点。以下示例生成URL /contact#part2。

@ app . route(& # 39;/')def v _ index():print URL _ for(& # 39;v _ contacts & # 39,_ anchor = & # 39第二部分& # 39;)@ app . route(& # 39;/联系& # 39;)def v_contacts():传递外部url:默认情况下,url_for()生成内部URL,可以将关键字parameter _external设置为True,生成包含站点地址的外部URL。下面的示例生成URL http://

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论