2016-03-31 5 views
1

Я видел шаблон в Flask (и Lithium), где один метод просмотра соответствует нескольким HTTP-глаголам; пример:Методы просмотра фляг и SRP

@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-ароматизированными?

ответ

4

Простой ответ: проще и часто чище. Большинство видов являются GET методы, и так Колба делает, что очень просто, с декорированным видами, такими как:

@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() код может быть очищен, и сделал менее раздутый по используя лучшую обработку формы и проверку с использованием колбовой WTF и колбовой Логина, который приведет вас т o процесс входа в систему, такой как:

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) 

Это долгий путь, говорящий, что у него есть варианты. Фляга не заставляет конкретный рассказ о вашем развитии, а то, что раздувается на одном , проект может быть кратким на другом, который решает другую цель.

Смежные вопросы