我们知道,flask可以使用装饰器来指定路由,而这不是唯一的方法,flask还提供了add_url_rule函数,所以如下的代码:
@app.route("/")
def index():
return render_template("index.html")
还能写成这样:
def index():
return render_template("index.html")
app.add_url_rule("/", "index", index)
可变路由
接下来我们看一个例子:
@app.route("/user/<username>")
def username(username):
return username
这里我们的路由变为了/user/<username>
,然而这其实代表着username是一个可变的东西,所以当我们访问/user/pynickle
时username就是pynickle,页面上就会显示出pynickle,我们还可以指定类型:
@app.route("/user/<int:id>")
这就指定是int类型。
除了这样,我们还可以指定默认值:
@app.route("/user/<int:id>", defaults={id: 1})
可插拔视图
可插拔视图在0.7版本引入,基于用类代替函数,现在来看下面的一个例子:
@app.route('/users')
def show_users(page):
users = User.query.all()
return render_template('users.html', users=users)
大家现在了解一下,User是一个数据库类,query.all函数则是用来取出所有数据的。现在假设我们要把这个数据来做数据展示,但是要是我们想把这个东西变成通用模板,那么我们可以把它演变成一个类:
from flask.views import View
class ShowUsers(View):
def dispatch_request(self):
users = User.query.all()
return render_template('users.html', objects=users)
app.add_url_rule('/users', view_func=ShowUsers.as_view('show_users'))
我们首先继承flask.views中的View类,并重写dispatch_request方法,然后通过as_view函数变成视图函数,然而这看起来好像没什么用,接下来继续:
from flask.views import View
class UserListView(View):
def get_template_name(self):
pass
def render_template(self, context):
return render_template(self.get_template_name(), **context)
def dispatch_request(self):
context = {'objects': self.get_objects()}
return self.render_template(context)
class UserView(UserListView):
def get_template_name(self):
return 'users.html'
def get_objects(self):
return User.query.all()
现在看起来好多了。
那么我们会想,请求方式怎么获取呢,其实很简单,也使用request.method参数获取。
不过有时候我们可以充分利用类的优势,来把不同的方法变成不同的函数,这时候就需要使用MethodView,只需要继承这个类,然后写上比如说get和post方法就好了,这里不做过多解析。