2019独角兽企业重金招聘Python工程师标准>>>

作为微框架,即便只有一个文件也可以编写基于 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' )

转载于:https://my.oschina.net/935572630/blog/371449

Flask 应用的文件结构相关推荐

  1. 巡风代码架构简介以及Flask的项目文件结构简介

    一.巡风: 巡风是一款什么东西,想必安全同行都不陌生吧.用它作为内网漏洞扫描管理架构是一种很好的选择,扫描快,开源,还可自己编写符合规则的POC直接放入相应目录来扩展.今天下午趁着有点时间捋了一下巡风 ...

  2. WIN7 IIS部署flask web项目

    参考资料: http://www.cnblogs.com/liluping860122/p/9203908.html https://segmentfault.com/a/11900000089092 ...

  3. [Flask+Vue]Books全栈应用

    Flask和Vue.js构建全栈单页面web应用[通过Flask开发RESTful API] 路小飞 退乎(假的) ​关注 146 人赞同了该文章 前言: 看了一些国外的关于介绍flask和vue的前 ...

  4. flask tutorial = make a blog :) flask 搭建博客系统从零开始!

    please follow the tutorial from the official site :) http://flask.pocoo.org/docs/ You could download ...

  5. Flask 实战:如何从零开发“知乎”

    作为当下十分火热的问答社区,知乎聚集了大量问题者和答题者. 但不少朋友在逛知乎的同时,也不禁想要开发一个像"知乎"这样的问答社区,既能够问题答题,也能拥有用户评论.点赞.收藏.浏览 ...

  6. flask查询mysql数据展示_flask再学习-思考之怎么从数据库中查询数据在页面展示!...

    看别人视频觉得很简单,要自己做蒙蔽了!这样子.NO! 1. 流程: 首先要有和数据库连接的驱动!一般有PYMySQL mysqlclient 等 使用扩展Flask-SQLAlchemy 获得orm对 ...

  7. linux搭建flask环境,Ubuntu 环境下搭建Flask框架

    开始安装 Flask,首先创建一个虚拟环境,这个环境能够安装所有的东西,而你的主 Python 不会受到影响.另外一个好处就是这种方式不需要你拥有 root 权限. 开始搭建环境:打开一个终端窗口,选 ...

  8. Flask笔记-构建mvc分层结构及优化

    大体上的结构如下: 这里举个例子: 程序运行截图如下: 打印个 文件结构如下: 源码如下: account.py from application import dbclass Account(db. ...

  9. 如何使用Python的Flask和Google App Engine构建网络应用

    by Tristan Ganry 由Tristan Ganry 这是一个小型教程项目,用于为初学者学习Flask,API和Google App Engine. (This is a small tut ...

最新文章

  1. android 图标拖动不了,拖动式选项卡(仿android) 添加了上下拉刷新后,下拉即刷新,而不是滚动到顶后再刷新,同时还想问一下正在刷新的图标怎么移到选项卡下...
  2. altium designer寻找未连接飞线
  3. Selenium3自动化测试——20.使用HTMLTestRunner获取测试报告
  4. Linux 系统运维 文件操作命令
  5. 基于文本知识库的强化学习技术——Learning to Win by Reading Manuals in a Monte-Carlo Framework
  6. Visual C++中MFC消息的分类
  7. Linux Wireless架构总结
  8. 《TCP/IP详解》学习笔记(六):UDP 协议
  9. 汇编中的函数调用与递归
  10. keep-alive + vuex + mint + Infinite scroll 保存分页列表数据
  11. 软件设计师10-面向对象-设计模式
  12. vc 6.0添加c文件 fatal error C1010解决办法
  13. iframe调用父页面方法_5.1 vue中子组件调用父组件的方法,务必理解自定义事件的重要性...
  14. 脏读、不可重复读与幻读和spring事务传播方式
  15. 计算可靠度编制matlab,工程结构可靠度计算的Matlab实现
  16. HashMap排序(java)
  17. creo绘图属性模板_CREO工程图模板创建
  18. TPC基准程序及tpmc值
  19. Shashlik Cooking(思维)
  20. 【29】CISC和RISC:为什么手机芯片都是ARM?

热门文章

  1. [SPOJ DQUERY] D-query(树状数组,离线)
  2. 使用 CSS 用户选择控制选择
  3. java怎么复制别人的数据库_java-如何在不使用Apache DDLUtils的情况下使用JDBC将模式从一个数据库复制到另一个数据库?...
  4. linux四种集群是什么,lvs四种集群特点及使用场景
  5. linux分区转换gpt命令,Linux中磁盘如何转换GPT格式
  6. oracle查看用户路径,oracle 查看用户的表空间,表空间路径,角色,权限
  7. 腾讯测试鸿蒙系统,爆料:荣耀 30 Pro已开始测试华为鸿蒙系统
  8. 疯狂的java 目录_疯狂创客圈 JAVA 高并发 总目录
  9. 可做fft分析吗_小吃店生意好做吗,小吃业行情分析
  10. ThreadLocal 中的ThreadLocalMap