我确定这个问题已经在其他地方回答了,但是我不时搜索一次,找不到一个好的答案。我的Flask项目规模越来越大,我认为它应该组织得更好。我使用了我喜欢的功能组织方法,但是觉得仍有改进的空间:
yourapp/
__init__.py
forms/
static/
utils/
templates/
home/
control_panel/
admin/
views/
__init__.py
user.py
control_panel.py
admin.py
reviews.py
models.py
模型是一个文件的示例,该文件随着时间的推移变得越来越笨拙。它当前在一个文件中定义每个表和数据库(超过5K行),并且我的大部分查询都在该文件中定义(但是处理该数据的大多数逻辑在其他地方)。应该将模型文件拆分为一个包吗?
第二,每个视图都具有路由以及应用程序逻辑,我开始认为应用程序逻辑应该在其他地方分开,但我不知道在哪里。例如,在reviews.py中,我有类似的内容:
@reviewsbp.route('/preload_reviews', methods=['GET','POST'])
@login_required
def preload_reviews():
bc, ct_list, bt_list = create_cus_billtype_lists(None)
csv_form = administrative_form.ReviewCSVImport()
cform = invoicing_form.InvoiceTo()
rbform = administrative_form.ReviewBatchForm()
cform.customer_type.choices = [(k, k) for k in ct_list]
cform.bill_type_select.choices = [(k,k) for k in bt_list]
if cform.validate_on_submit() and rbform.validate() and csv_form.validate():
try:
import_d = process_review_import(cform, rbform, csv_form)
return render_template('/reviews/import_csv_results.html',
title='Import Results', import_d = import_d)
except AppError as ae:
flash(ae,'negative')
except Exception as e:
return render_template('error.html', message=e)
return render_template('reviews/review_batch_import.html',
title="Review Batch Import", cform=cform,
bt_list = ','.join(bt_list), rbform=rbform,
csv_form = csv_form)
def process_review_import(cform, rbform, csv_form):
extension = os.path.splitext(csv_form.csv_file.data.filename)[1]
if extension.lower() != '.csv':
flash('Only CSV Files allowed.', 'negative')
return redirect('/reviews/preload_reviews')
file_path = tempfile.mkstemp(suffix='.csv')[1]
csv_form.csv_file.data.save(file_path)
with open(file_path,'r') as f:
import_d = parse_review_import_csv(f)
validate_review_data(import_d)
import_d = check_for_duplicates(import_d)
import_d = save_review_data_to_db(cform, rbform, import_d)
os.unlink(file_path)
return import_d
上述路由还有其他一些功能可以处理数据。这些应该去哪里?最好的做法是将它们与路线定义放在一起或放在其他地方。随着时间的流逝,它们可能会成为其他视图所共有的,这表明它们应该存储在其他位置,以至少防止循环进口,同时也更易于查看已发布的路线。
回顾:
答案 0 :(得分:1)
有效地,Flask让您自己决定。这是平台的优势之一-例如,与Django之类的东西相比,它拥有更少的约定和更少的见解,我们几乎是预先搭建好的。
冒着无助的风险,您可以轻松回答“取决于情况”,但可以作为指导:
Blueprints是一种组织代码的方式,类似于 Django的应用程式模式。您可以想象一个蓝图可以 包含特定于模型,视图和路线的单独文件夹 一个“应用”,可以想象为功能的集合。对于 例如“用户”可以是一个蓝图/应用程序。
那可能很好,而且合乎逻辑。保持良好习惯 数据以及首先紧密获取数据的方法 一起。
这是您的电话,具体取决于您的代码在做什么。 views.py
和
routes.py
是相似的名称,您可以将其拆分为
user/views.py
或user/routes.py
(如果需要)。如果你只是
编写帮助程序或实用程序,拥有utils.py
可能会有所帮助
或helpers.py
文件,无论您的路线在哪里,然后
导入重要的类或方法以获得更好的结构,以及
较小的整体文件。
这是您的电话,具体取决于您的代码在做什么。 views.py
和
routes.py
是相似的名称,您可以将其拆分为
user/views.py
或user/routes.py
(如果需要)。如果你只是
编写帮助程序或实用程序,使用utils.py
可能会有所帮助
或helpers.py
函数对,无论您的路线在哪里,然后
导入重要的类或方法以获得更好的结构,以及
较小的文件。
helper/util.py
中并将其导入
进入一个或多个地方。其中大部分是个人喜好-但请看一下Django的结构。您不想重新创建所有内容,但是您可能需要一些有用的提示。