Python 如何组织蓝图/方法/路线的功能

Python 如何组织蓝图/方法/路线的功能,python,flask,Python,Flask,我确信这个问题已经在其他地方得到了回答,但我每隔一段时间就会搜索一次,却找不到一个好的答案。我的Flask项目规模在不断扩大,我认为它应该比现在组织得更好。我使用功能组织方法,我喜欢,但觉得还有改进的余地: yourapp/ __init__.py forms/ static/ utils/ templates/ home/ control_panel/ admin/ views/ _

我确信这个问题已经在其他地方得到了回答,但我每隔一段时间就会搜索一次,却找不到一个好的答案。我的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
上面的路由还有几个其他功能来处理数据。这些应该去哪里?将它们与路线定义放在一起或放在其他地方是最佳做法。随着时间的推移,它们可能会在其他视图中变得常见,这表明它们应该存储在其他位置,以至少防止循环导入,同时也更容易查看已发布的路线

重述:

  • 大型项目应如何组织models.py文件(作为模块中的单独文件)
  • 对于每个模型,查询应该存储为classmethod还是存储在其他地方
  • 处理查询数据的逻辑,应该存储在模型中还是与其他应用程序逻辑一起
  • 应用程序逻辑是否应该与存储路由(蓝图)的位置分开?如果是的话,那通常叫什么
  • 路线应该有多“瘦”?在整个项目中,有许多20-30条线路在执行一些简单的操作,比如CRUD操作,所有逻辑都在路线中定义

  • 实际上,Flask把这件事留给了你。这是这个平台的优势之一,因为它比Django这样的东西有更少的约定,更少的观点,例如,我们几乎是预先搭建好的

    冒着帮不上忙的风险,你可以轻松地回答“视情况而定”,但作为指导:

  • 是一种以类似的方式组织代码的方法 Django的应用程序模式。你可以想象蓝图可以 包含特定于的模型、视图和管线的单独文件夹 可以想象为功能集合的“应用程序”。对于 示例“用户”可以是蓝图/应用程序

  • 这可能很好,而且合乎逻辑。保持健康是一种很好的习惯 数据以及首先获取该数据的方法 一起

  • 这是您的调用,取决于您的代码在做什么<代码>视图.py和
    routes.py
    是类似的名称,您可以将其拆分为
    user/views.py
    user/routes.py
    如果需要。如果你只是 在编写帮助程序或实用程序时,使用
    utils.py
    或路径所在位置旁边的
    helpers.py
    文件,然后 导入重要的类或方法以获得更好的结构和 较小的总体文件

  • 这是您的调用,取决于您的代码在做什么<代码>视图.py和
    routes.py
    是类似的名称,您可以将其拆分为
    user/views.py
    user/routes.py
    如果需要。如果你只是 在编写帮助程序或实用程序时,使用
    utils.py
    或者,无论您的路线在哪里,都可以使用
    helpers.py
    函数耦合,然后 导入重要的类或方法以获得更好的结构和 较小的文件

  • 您的电话-我的建议是,如果路线或视图具有逻辑性 可以舒适地自我包含,包括任何错误处理 我想继续走这条路。如果你在写新的逻辑或者你喜欢的东西 可能需要重用,将它们插入到
    helper/util.py
    中并导入它 进入一个或多个地方
  • 这在很大程度上是个人偏好——但看看Django的结构。您不想全部重新创建,但可能需要一些有用的提示