Flask的基于类的视图
项目描述
注意
This is a fork of original `Flask-Classy` for continuing its development since the original project was not updated for a long time. For more information, see: https://github.com/apiguy/flask-classy/issues/80
Flask-Classful是一个扩展,它为Flask添加了基于类的视图。但为什么?
我喜欢Flask。非常喜爱。但有时项目会变得有点大,我需要一种方式来管理和组织所有的不同部分。我知道你在说什么:“但是蓝图呢?”
你说得对。蓝图相当不错。但我发现它们并不总是足以封装我需要的特定上下文。我想要的,不,我需要的是能够将我的视图分组到相关的类中,每个类都有自己的上下文和行为。这也使得测试变得非常方便。
“好吧,我明白了。但我不能只使用flask.views中的基类来实现这一点吗?”
嗯,是的,也不是。虽然flask.views.MethodView确实提供了flask_classful.FlaskView的一些功能,但它并没有通过支持不属于给定资源典型CRUD操作的方法,或者使我能够轻松地覆盖特定视图的路由规则来完整地展现这一点。而flask.views.View确实添加了一些上下文,但它需要为每个视图创建一个类,而不是让我能够将相同资源的非常相似的视图组合成一个类。
“但是我的项目并不大。Flask-Classful除了使大型项目更容易管理之外,还能为我做些什么?”
当然,它在其他一些事情上也有帮助。
例如,Flask-Classful会根据你的视图中的方法自动生成路由,并使用Flask熟悉的装饰器语法使覆盖这些路由变得非常简单。
安装
使用以下命令安装最新扩展:
$ pip install flask-classful
让我们看看它是如何工作的
如果你像我一样,当你看到某物在使用时,你可能会对如何使用它有一个更好的理解。让我们创建一个简单的应用来看看Flask-Classful是如何工作的。
from flask import Flask
from flask_classful import FlaskView
# we'll make a list to hold some quotes for our app
quotes = [
"A noble spirit embiggens the smallest man! ~ Jebediah Springfield",
"If there is a way to do it better... find it. ~ Thomas Edison",
"No one knows what he can do till he tries. ~ Publilius Syrus"
]
app = Flask(__name__)
class QuotesView(FlaskView):
def index(self):
return "<br>".join(quotes)
QuotesView.register(app)
if __name__ == '__main__':
app.run()
运行此应用,并在您的网页浏览器中打开: http://localhost:5000/quotes/
正如你所看到的,它返回了引言列表。但如果我们只想得到一个引言呢?那时我们该怎么做呢?
class QuotesView(FlaskView):
def index(self):
...
def get(self, id):
id = int(id)
if id < len(quotes):
return quotes[id]
else:
return "Not Found", 404
现在将浏览器指向: http://localhost:5000/quotes/1/,你应该会看到来自尊敬的艾迪生先生的非常深刻的引言。
这很酷,但是如果我们只想得到一个随机的引言呢?那时我们该怎么做?让我们给我们的FlaskView添加一个随机视图。
from random import choice
class QuotesView(FlaskView):
def index(self):
...
def get(self, id):
...
def random(self):
return choice(quotes)
将浏览器指向: http://localhost:5000/quotes/random/,每次都会返回一个随机的引言。哇!
所以到目前为止,你可能已经敏锐地意识到你还没有定义任何路由,但路由显然正在发生。“这是巫术吗?”你问?
根本不是。Flask-Classful会自动为FlaskView中任何不以下划线字符开头的函数创建路由。当然,你仍然可以定义自己的路由,我们将在下一部分看到。