python - Flask 中的蓝图
问题描述
我正在接管一个具有用户模块但没有登录页面的 Flask 应用程序。项目结构如下:
|-application.py
|-manage.py
|-settings.py
|-/templates
|----base.html
|----index.html
|----navbar.html
|----/user
|--------views.py
应用程序.py:
from flask import Flask
....
def create_app(**config_overrides):
app = Flask(__name__)
app.config.from_pyfile('settings.py')
app.config.update(config_overrides)
db.init_app(app)
from user.views import user_app
app.register_blueprint(user_app)
return app
用户/views.py:
from flask import Blueprint, render_template, request, redirect, session, url_for, abort
...
user_app = Blueprint('user_app', __name__)
@user_app.route('login', methods = ('GET','POST'))
def login():
....
我将 index.html 放在模板文件夹中。
我应该在根目录中放置一个 view.py 来放置到 index.html 的路由吗?
解决方案
您可以在任何地方添加其他路线。
然而,由于包使用了一个create_app()
应用工厂,你不能用@app.route()
装饰器注册这些路由;该应用程序不是以您可以导入的方式创建的。
所以,是的,创建一个views.py
模块是一个很好的组织理念,但也要在Blueprint()
那里创建一个,并将该蓝图注册到应用程序实例的create_app()
函数中。Flask()
在views.py
:
from flask import Blueprint
bp = Blueprint('main', __name__)
@main.route('/')
def index():
# produce a landing page
并在create_app()
in 中application.py
添加
import views
app.register_blueprint(views.bp)
(我对所有蓝图使用bp
变量名称的约定,然后只导入模块并注册module.bp
属性)。
正是显式导入和app.register_blueprint()
调用将Flask
项目中使用的任何蓝图与最终应用程序的路由联系起来。蓝图可以共享相同的前缀,包括没有前缀。
需要注意的一件事:这里的views
模块现在是 . 旁边的顶级模块application.py
。如果将所有内容都移到一个package中会更好,让您可以更自由地使用什么名称。json
单个包中的所有模块都具有命名空间,与其他顶级模块(例如andtime
和)分开flask
,因此当您想为项目中的其他模块之一使用相同的名称时不会发生冲突。
您会将所有内容都manage.py
移到一个子目录中,并使用适合项目的名称,然后application.py
移至__init__.py
. 然后可以使用 Importsfrom . import ...
从当前包导入,等等。
推荐阅读
- jquery - Gatsby JS:预加载器永远加载
- javascript - .map() 方法在项目之间打印“,”
- silverstripe - 从夹具文件生成的字段列表中的未知列
- python - Windows 上的 Visual Studio Code 远程 Python 调试
- javascript - Jquery脚本不适用于表单提交
- c++ - 如何阻止 C++ 控制台输出“tick”
- r - 如何将向量中的元素作为 R 中的参数传递给函数?
- html - HTML 的 XPath,只需要那些带有特定单词的元素
- css - 在 React 组件的内联 SVG 元素中嵌入 base64 编码字体
- javascript - javascript合并2个未定义元素的数组