如何为蓝图/方法/路线组织烧瓶功能

时间:2020-01-12 22:03:16

标签: python flask

我确定这个问题已经在其他地方回答了,但是我不时搜索一次,找不到一个好的答案。我的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

上述路由还有其他一些功能可以处理数据。这些应该去哪里?最好的做法是将它们与路线定义放在一起或放在其他地方。随着时间的流逝,它们可能会成为其他视图所共有的,这表明它们应该存储在其他位置,以至少防止循环进口,同时也更易于查看已发布的路线。

回顾:

  1. 对于大型项目,如何组织models.py文件(作为模块中的单独文件)?
  2. 是否应将查询存储为每个模型或其他模型的类方法?
  3. 处理查询数据的逻辑,应该将其存储在模型中还是与其他应用程序逻辑一起存储?
  4. 是否应该将应用程序逻辑与路线(蓝图)的存储位置分开?如果是这样,通常称为什么?
  5. 路线应该如何“瘦”?在整个项目中,有20到30条生产线完成了许多类似CRUD操作的简单操作,并在路由内定义了所有逻辑。

1 个答案:

答案 0 :(得分:1)

有效地,Flask让您自己决定。这是平台的优势之一-例如,与Django之类的东西相比,它拥有更少的约定和更少的见解,我们几乎是预先搭建好的。

冒着无助的风险,您可以轻松回答“取决于情况”,但可以作为指导:

  1. Blueprints是一种组织代码的方式,类似于 Django的应用程式模式。您可以想象一个蓝图可以 包含特定于模型,视图和路线的单独文件夹 一个“应用”,可以想象为功能的集合。对于 例如“用户”可以是一个蓝图/应用程序。

  2. 那可能很好,而且合乎逻辑。保持良好习惯 数据以及首先紧密获取数据的方法 一起。

  3. 这是您的电话,具体取决于您的代码在做什么。 views.pyroutes.py是相似的名称,您可以将其拆分为 user/views.pyuser/routes.py(如果需要)。如果你只是 编写帮助程序或实用程序,拥有utils.py可能会有所帮助 或helpers.py文件,无论您的路线在哪里,然后 导入重要的类或方法以获得更好的结构,以及 较小的整体文件。

  4. 这是您的电话,具体取决于您的代码在做什么。 views.pyroutes.py是相似的名称,您可以将其拆分为 user/views.pyuser/routes.py(如果需要)。如果你只是 编写帮助程序或实用程序,使用utils.py可能会有所帮助 或helpers.py函数对,无论您的路线在哪里,然后 导入重要的类或方法以获得更好的结构,以及 较小的文件。

  5. 您的电话-我的建议是,如果路线或视图具有逻辑 可以自给自足,包括任何错误处理, 想要继续前进。如果您正在编写新的逻辑或事物, 可能想重复使用,将其插入helper/util.py中并将其导入 进入一个或多个地方。

其中大部分是个人喜好-但请看一下Django的结构。您不想重新创建所有内容,但是您可能需要一些有用的提示。

相关问题