Python 烧瓶视图方法和SRP

Python 烧瓶视图方法和SRP,python,flask,lithium,single-responsibility-principle,Python,Flask,Lithium,Single Responsibility Principle,我在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 u

我在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中的默认模式,但现在我看到了它的存在


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

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

@app.route('/')
def home():
    thing = do_fun_stuff()
    return render_template('home.html', foo=thing)
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)
如果我想使用一个你觉得不那么臃肿的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'))
事实上,您的登录代码可以通过 使用Flask WTF和Flask登录进行更好的表单处理和验证 将引导您进入登录过程,例如:

@app.route('/')
def home():
    thing = do_fun_stuff()
    return render_template('home.html', foo=thing)
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)
这是一个很长的路要说,这是很好的选择。烧瓶没有 在你的发展过程中强加一个特定的叙述,在其中一个叙述中什么是浮夸的
另一个解决不同目标的项目可能简洁明了。

简单的答案是更简单,而且通常更干净。大多数意见 是GET方法,所以Flask非常简单,带有装饰 意见,例如:

@app.route('/')
def home():
    thing = do_fun_stuff()
    return render_template('home.html', foo=thing)
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)
如果我想使用一个你觉得不那么臃肿的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'))
事实上,您的登录代码可以通过 使用Flask WTF和Flask登录进行更好的表单处理和验证 将引导您进入登录过程,例如:

@app.route('/')
def home():
    thing = do_fun_stuff()
    return render_template('home.html', foo=thing)
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)
这是一个很长的路要说,这是很好的选择。烧瓶没有 在你的发展过程中强加一个特定的叙述,在其中一个叙述中什么是浮夸的 另一个解决不同目标的项目可能简洁明了