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