【问题标题】:Flask view methods and SRP [closed]Flask 视图方法和 SRP [关闭]
【发布时间】:2016-03-31 18:05:07
【问题描述】:

我在 Flask(和 Lithium)中看到了一种模式,其中单个视图方法对应于多个 HTTP 动词;示例:

@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] != app.config['USERNAME']:
            error = 'Invalid username'
        elif request.form['password'] != app.config['PASSWORD']:
            error = 'Invalid password' 
    else:
        session['logged_in'] = True
        flash('You were logged in')
        return redirect(url_for('show_entries'))
    return render_template('login.html', error=error)

我认为这会导致臃肿的视图方法做不止一件事。

我本来想问为什么这是 Flask 中的默认模式,但现在我看到 method-based views 存在。

不过,为什么框架中有非基于方法的视图呢?因为并非所有客户端-服务器协议都通过 REST 进行通信,而基于方法的视图本身就是 REST 风格的?

【问题讨论】:

    标签: python flask lithium single-responsibility-principle


    【解决方案1】:

    简单的答案是它更容易,而且通常更干净。多数意见 是 GET 方法,所以 Flask 使这变得非常简单,带有装饰 诸如:

    @app.route('/')
    def home():
        thing = do_fun_stuff()
        return render_template('home.html', foo=thing)
    

    如果我想用你觉得不那么臃肿的MethodView 来表示,我最终会得到:

    class HomeView(MethodView):
    
        def get(self):
            thing = do_fun_stuff()
            return render_template('home', foo=thing)
    
    app.add_url_rule('/', view_func=HomeView.as_view('home'))
    

    实际上,您的login() 代码可以通过 使用 Flask-WTF 和 Flask-Login 使用更好的表单处理和验证, 将引导您进入登录过程,例如:

    app.route('/login', methods=['GET', 'POST'])
    def login():
        form = LoginForm()
        if form.validate_on_submit():
            login_user(form.user)
            return redirect(url_for('show_entries'))
        return render_template('login.html', form=form)
    

    这是一个很长的说法,很高兴有选择。烧瓶没有 在你的发展中强加一个特定的叙述,以及一个臃肿的东西 项目可能在另一个解决不同目标的情况下简洁。

    【讨论】:

      猜你喜欢
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 2013-07-10
      相关资源
      最近更新 更多