文档章节

Flask 应用的文件结构

指尖跳动的精灵
 指尖跳动的精灵
发布于 2015/01/24 23:14
字数 1139
阅读 58
收藏 1

作为微框架,即便只有一个文件也可以编写基于 Flask 的 Web 应用。然而对于许多现实世界中的应用,拥有数十个以上的视图(view)是非常正常的,这时候,Flask 建议使用多个 Python 模块来组织视图。例如:

/ yourapplication
     / yourapplication
         / __init__.py
         / views
             __init__.py
             admin.py
             frontend.py
         / static
             / style.css
         / templates
             layout.html
             index.html
             login.html
             ...

视图保存在包yourapplication.views中。这里只需要放置一个空白的__init__.py文件即可。我们来看看包中的admin.py文件。首先,我们使用 Python 模块名称创建一个 Flask 模块(flask.Module)对象,这个对象行为上非常类似 flask.Flask 对象,它们大多数方法都是一样的。下面是一个易于理解的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from flask import Module
 
admin = Module(__name__)
 
@admin .route( '/' )
def index():
     pass
 
@admin .route( '/login' )
def login():
     pass
 
@admin .route( '/logout' )
def logout():
     pass

对于frontend.py我们也可以做类似的处理,接下来,我们只需要确保在整个应用程序的__init__.py中注册这些模块即可:

1
2
3
4
5
6
7
from flask import Flask
from yourapplication.views.admin import admin
from yourapplication.views.frontend import frontend
 
app = Flask(__name__)
app.register_module(admin, url_prefix = '/admin' )
app.register_module(frontend)

通过将这些模块注册到应用中,应用程序的 URL 映射表就能够适用于这些模块中的配置了。请注意 admin 模块的注册参数 url_prefix:默认的当我们注册一个模块时,缺省的 endpoint 是“/”,要使用其它的前缀,必须通过 url_prefix 参数配置。

使用 Flask 模块和直接使用 Flask 对象有什么区别呢?最主要的区别在 URL 生成的问题上。例如,我们经常使用的 url_for() 函数,当直接与 Flask 对象一起工作时,它的第一个参数,也就是所谓的 endpoint,是视图函数的名称,而当结合 Flask 模块一起工作时,对于同一个模块中的视图函数,用法仍然一样,而对于别的模块中的函数,则需要使用模块名加上句点作为前缀。看看下面的例子可以帮助我们更 容易的理解这个问题。假设我们在 admin 模块中有一个需要重定向到 frontend 模块的函数,它看起来类似这样:

1
2
3
4
5
6
7
@admin .route( '/to_frontend' )
def to_frontend():
     return redirect(url_for( 'frontend.index' ))
 
@frontend .route( '/' )
def index():
     return "I'm the frontend index"

而如果我们只需要重定向到相同模块中的其它函数,那么我们既可以使用完成的 endpoint 路径,也可以只使用函数名:

1
2
3
4
5
6
7
@frontend .route( '/to_index' )
def to_index():
     return redirect(url_for( 'index' ))
 
@frontend .route( '/' )
def index():
     return "I'm the index"

更进一步,如果我们的 Module 对象是放在 Python 包中的,这样,我们有增加了额外的放置模板和静态文件的位置。假设我们的应用程序看起来像是这样的:

/ yourapplication
     __init__.py
     / apps
         __init__.py
         / frontend
             __init__.py
             views.py
             / static
                 style.css
             / templates
                 index.html
                 about.html
                 ...
         / admin
             __init__.py
             views.py
             / static
                 style.css
             / templates
                 list_items.html
                 show_item.html
                 ...

这些包中的静态目录将会被自动展开为 URL。假设这个admin模块是通过 /admin 前缀展现在 URL 中的,那么可以通过/admin/static/style.css 来访问其中的样式表文件。而该文件的 endpoint 则是 'admin.static'。

与 URL 规则可以省略前缀不同,我们总是需要使用完成的模块名称来引用模板,例如:render_template('admin/list_items.html') 等等。同样的,既然我们的视图函数已经从yourapplication.views.admin移动到yourapplication.apps.admin.views中了,我们需要在注册模块的时候明确的设置一个名称。这是由于再使用 __name__ 作为参数的话它这时候的值是 views 了:

1
2
# in yourapplication/apps/admin/views.py
admin = Module(__name__, 'admin' )

同样的,引导程序也需要稍作调整:

1
2
3
4
5
6
7
8
# in yourapplication/__init__.py
from flask import Flask
from yourapplication.apps.admin.views import admin
from yourapplication.apps.frontend.views import frontend
 
app = Flask(__name__)
app.register_module(admin, url_prefix = '/admin' )
app.register_module(frontend)

值得注意的是,如果我们使用一个不合格的 endpoint,默认的 Flask 会将它当作是模块的静态文件目录,即便这个目录并不存在。这对于任何 endpoint 都有效,而不仅仅是名为 static 的目录,只不过通常我们使用 static 放置静态文件而非设置一个视图函数而已。如果需要使用整个应用程序的静态目录,可以在最开始加上一个句点:

1
2
3
4
5
# this refers to the application's static folder
url_for( '.static' , filename = 'static.css' )
 
# this refers to the current module's static folder
url_for( 'static' , filename = 'static.css' )


本文转载自:http://www.cnblogs.com/xuecan/archive/2011/02/17/1957411.html

共有 人打赏支持
上一篇: python __init__.py
指尖跳动的精灵
粉丝 16
博文 90
码字总数 48459
作品 0
海淀
私信 提问
Flask框架的学习与实战:实战小项目

昨天写了一篇flask开发环境搭建,今天继续,进行一个实战小项目-blog系统。 blog系统很简单,只有一个页面,然而麻雀虽小五脏俱全。这里目的不是为了做项目而做项目,这篇文章本意是通过这次...

yzy121403725
2018/05/24
0
0
使用 jinja2 渲染 HTML 模板

使用 jinja2 渲染 HTML 模板 42分钟前 ⋅ 8 ⋅ 0 ⋅ 0 要更新模板中的用户名和密码,返回要邮件发送的内容 message = render_template("email.html", name="xxx", password='xxx') File "xxx.......

作者:Vimiix
2018/01/22
0
0
FLask 初探三( 隐藏配制文件实践 )

引言 Flask初探一(Flask 各参数的应用) 中提到了隐藏重要配置( 敏感配置) 的方式, 今天详细研究一下怎么样实现. 创建项目 项目结构 main.py 假设configprivate 目录下的configprivate.py是要...

DragonFangQy
2018/06/24
0
0
从零开始搭建论坛(三):Flask框架简单介绍

前面两篇文章中我们已经了解 Web(HTTP)服务器,Web应用程序,Web框架,WSGI这些 Python Web 开发中的概念。我们知道,Web框架通过将不同Web应用程序中的共性部分给抽象出来,提供一系列通用的...

selfboot
2016/10/30
0
0
[flask-SQLAlchemy]关于flask-SQLAlchemy的初级使用教程

鉴于网上关于flask-SQLAlchemy的实例使用教程参差不齐,于此写下工作学习过程中的使用过程,以便分享交流。 对于python关于flask有一定了解的高端玩家来说,请转至flask官方开发文档。 一.安...

yzy121403725
2018/05/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Hibernate SQLite方言

以下代码有参考过github上国外某位大佬的,在发文的最新稳定版Hibernate上是可用的,有时间再仔细分析一下 import org.hibernate.dialect.Dialect;import org.hibernate.dialect.function.S...

CHONGCHEN
今天
3
0
CentOS 7 MariaDB搭建主从服务器

本文编写环境为CentOS7。确保关闭SELinux,关闭防火墙或者防打开指定端口。具体信息如下 #master[root@promote ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [r...

白豆腐徐长卿
今天
10
0
介绍python中运算符优先级

下面这个表给出Python的运算符优先级,从最低的优先级(最松散地结合)到最高的优先级(最紧密地结合)。这意味着在一个表达式中,Python会首先计算表中较下面的运算符,然后在计算列在表上部...

问题终结者
今天
3
0
Spring Boot 2.x基础教程:快速入门

简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot来让...

程序猿DD
昨天
10
0
SpringSecurity认证流程源码级详解

SpringSecurity认证流程源码级详解 认证流程说明 认证结果如何在多个请求之间共享 获取认证用户信息

chendom
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部