Flask 视图方法和 SRP

Flask view methods and SRP

我在 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 风格的?

简单的答案是它更容易,而且通常更干净。大多数意见 是 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)

说来话长,有选择真好。烧瓶没有 在你的发展中强加一个特定的叙述,以及一个人的臃肿 项目可能在解决不同目标的另一个项目上是简洁的。