Python 如何组织蓝图/方法/路线的功能
我确信这个问题已经在其他地方得到了回答,但我每隔一段时间就会搜索一次,却找不到一个好的答案。我的Flask项目规模在不断扩大,我认为它应该比现在组织得更好。我使用功能组织方法,我喜欢,但觉得还有改进的余地:Python 如何组织蓝图/方法/路线的功能,python,flask,Python,Flask,我确信这个问题已经在其他地方得到了回答,但我每隔一段时间就会搜索一次,却找不到一个好的答案。我的Flask项目规模在不断扩大,我认为它应该比现在组织得更好。我使用功能组织方法,我喜欢,但觉得还有改进的余地: yourapp/ __init__.py forms/ static/ utils/ templates/ home/ control_panel/ admin/ views/ _
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
上面的路由还有几个其他功能来处理数据。这些应该去哪里?将它们与路线定义放在一起或放在其他地方是最佳做法。随着时间的推移,它们可能会在其他视图中变得常见,这表明它们应该存储在其他位置,以至少防止循环导入,同时也更容易查看已发布的路线
重述:
实际上,Flask把这件事留给了你。这是这个平台的优势之一,因为它比Django这样的东西有更少的约定,更少的观点,例如,我们几乎是预先搭建好的 冒着帮不上忙的风险,你可以轻松地回答“视情况而定”,但作为指导:
routes.py
是类似的名称,您可以将其拆分为
user/views.py
或user/routes.py
如果需要。如果你只是
在编写帮助程序或实用程序时,使用utils.py
或路径所在位置旁边的helpers.py
文件,然后
导入重要的类或方法以获得更好的结构和
较小的总体文件routes.py
是类似的名称,您可以将其拆分为
user/views.py
或user/routes.py
如果需要。如果你只是
在编写帮助程序或实用程序时,使用utils.py
或者,无论您的路线在哪里,都可以使用helpers.py
函数耦合,然后
导入重要的类或方法以获得更好的结构和
较小的文件helper/util.py
中并导入它
进入一个或多个地方