当前位置: 代码迷 >> python >> 每个烧瓶视图功能都具有多个路由是不好的做法吗?
  详细解决方案

每个烧瓶视图功能都具有多个路由是不好的做法吗?

热度:26   发布时间:2023-06-27 21:59:01.0

因此,基本上我有多个基于if语句的render_template返回,并且它们返回jinja2模板响应的不同变量。 我相信我可以将这些路由分解为各自的功能(同样,我也可以将模板分解为多个模板(例如,模板中的edit.html模板而不是{% if editform %} )),但是我喜欢为任何给定页面具有单一视图功能和模板的想法。

在花更多时间创建其余视图函数之前,我想确保以后所做的事情不会对我造成影响。

下面的代码,谢谢!

@app.route('/admin/users/', defaults={'id': None}, methods = ['GET'])
@app.route('/admin/users/<id>', methods = ['GET'])
@app.route('/admin/users/edit/<id>', methods = ['GET', 'POST'])
@login_required
def users(id):
    if not current_user.role == ROLE_ADMIN:
        flash('You do not have access to view this page.')
        return redirect(url_for('index'))

    if id:
        user = User.query.filter_by(id = id).first()

        if 'edit' in request.path:
            editform = UserForm()

            if editform.validate_on_submit():
                user.username = editform.username.data
                user.email = editform.email.data
                user.role = editform.role.data

                db.session.add(user)
                db.session.commit()

                return redirect('/admin/users/' + str(user.id))

            editform.username.data = user.username
            editform.email.data = user.email
            editform.role.data = user.role

            return render_template("users.html",
                title = "Edit User",
                user = user,
                editform = editform)

        return render_template("users.html",
            title = "User",
            user = user)

    users = User.query.all()

    return render_template("users.html",
        title = 'Users',
        users = users)

这个问题的答案可能有点取决于个人喜好,但就我个人而言,我会避免这样做。 我的主要理由只是为了使事情保持简单-在该函数内有三个嵌套的if语句,它们基本上与如果拆分视图的flask路由逻辑所执行的工作完全相同。

诚然,目前这不是一个大问题,但是如果您要在任何路径中添加更多逻辑,则可能导致功能异常复杂。 这可能会导致细微的错误,或者只是一眼就很难理解确切的情况。

但是,如果将它们分开,那么一眼便可以清楚地看出每条路线的作用。 甚至不涉及更多代码,因为您可以使用所有if语句:

@app.route('/admin/users/', methods = ['GET'])
def get_all_users():
    users = User.query.all()

    return render_template("users.html",
        title = 'Users',
        users = users)

@app.route('/admin/users/<id>', methods = ['GET'])
def get_single_user(id):
    user = User.query.filter_by(id = id).first()

    return render_template("users.html",
        title = "User",
        user = user)

@app.route('/admin/users/edit/<id>', methods = ['GET', 'POST'])
def edit_user(id):
    editform = UserForm()

    if editform.validate_on_submit():
        user.username = editform.username.data
        user.email = editform.email.data
        user.role = editform.role.data

        db.session.add(user)
        db.session.commit()

        return redirect('/admin/users/' + str(user.id))

    editform.username.data = user.username
    editform.email.data = user.email
    editform.role.data = user.role

    return render_template("users.html",
        title = "Edit User",
        user = user,
        editform = editform)

编辑:澄清一下-我并不是说每个烧瓶路由都包含多个URL是错误的。 在这种情况下,我认为让一个函数执行三项完全不同的事情是一个坏主意。 我确实利用了每个视图的多个路由的其他用例。 例如,在我自己的代码中,我经常有如下视图:

@migrations_tasks.route('/external_applications', methods=['GET'])
@migrations_tasks.route('/external_applications/<cursor>', methods=['POST'])
def migrate_external_applications(cursor=None, subdomain=None):
    ... do stuff

替代路由将游标接受到数据库查询中以进行分页。 代码的流程基本相同,只是首页和后续页面的URL不同。

没有硬性规定,但我建议原则,将多个功能拆分为更多模块。

我什至可以更进一步,并使用 ,其中每条路线都有一个类,其中get,post,post等已从基类覆盖。

当您的函数很小时,看起来还可以,但是当它增长时,一些模块化会有所帮助!

  相关解决方案