一:Flask中url的工作方式
# encoding=utf-8 from flask import Flask app = Flask(__name__) @app.route("/task/") def task_list(): return "List of all task" @app.route("/task/<int:task_id>/") def task_detail(task_id): return "Detail of task#{}.".format(task_id) @app.route("/task/<int:task_id>/edit/",methods=[‘GET‘,‘POST‘]) def task_edit(task_id): return ‘From to edit task#{}.‘.format(task_id) @app.route("/task/create/",methods=[‘GET‘,‘POST‘]) def task_create(): return "Create New Task" @app.route("/task/<int:task_id>/delete/",methods=[‘DELETE‘]) def task_delete(task_id): raise NotImplementedError(‘DELETE‘)
上面列出一些url装饰器操纵,下面通过浏览器访问相应的url就会触发相应的操作。
/task/<int:task_id> 将匹配/task/任意个数字这样的模式,并且url相应的数字将会赋值给task_id。
methods=[‘GET‘,‘POST‘] 代表这个url装饰器只接受GET和POST两种请求方式,默认只接受GET请求。
当使用delete方法的时候会触发NotImplementError错误。
二:URL构建
flask中任何一个url都需要自己来构建不是自动生成的,比如我想连接一个css文件,这个文件的路径可能是
static/style.css,但是flask是不允许直接使用这个路径的,需要构建这个url。flask提供了url_for来构建url。通过
app.route装饰器也可以构建url但是这需要关联一个function。url_for只用于建立一个url。
下面来看下url_for的几个例子:
# encoding=utf-8 from flask import Flask from flask import url_for app = Flask(__name__) @app.route("/task/<int:task_id>/edit/",methods=[‘GET‘,‘POST‘]) def task_edit(task_id): return ‘From to edit task#{}.‘.format(task_id) @app.route(‘/task/<int:task_id>/‘) def task_detail(task_id): edit_url = url_for(‘task_edit‘,task_id=task_id) return edit_url
对于url_for()函数来说,第一个参数叫做endpoint,默认是包裹在app.route装饰器里面的函数名字,也可以通过endpoint来修改:
看如下例子:
# encoding=utf-8 from flask import Flask from flask import url_for app = Flask(__name__) @app.route("/task/<int:task_id>/edit/",methods=[‘GET‘,‘POST‘],endpoint=‘aliasname‘) def task_edit(task_id): return ‘From to edit task#{}.‘.format(task_id) @app.route(‘/task/<int:task_id>/‘) def task_detail(task_id): edit_url = url_for(‘aliasname‘,task_id=task_id) return edit_url
给task_edit的装饰器加入了endpoint的参数,task_detail就可以使用endpoint来构建url
默认情况下用户输入一个url例如http://127.0.0.1/***/*** 最后不带‘/‘ 的url,flask都会在末尾添加上‘/‘
所以装饰器中的url最后都写成带‘/‘的形式
三:URL中的参数
对于上面的例子/task/<int:task_id>/edit/可以通过在url给函数传递参数,
flask提供了一个参数装换器<converter:argument> 只有当传递的参数通过convert转换后合法才行。
flask提供了三个converters有三个:
int:参数值必须是整型
float:参数值必须是浮点型
path:参数值必须是string,并且string也是默认的,还可以接受"/"线
我们也可以自己定义自己的conventer,通过flask提供的url_map来自定义自己的conventer。
# encoding=utf-8 from flask import Flask from flask import url_for,render_template from werkzeug.routing import BaseConverter class ListConverter(BaseConverter): def to_python(self, value): return value.split(‘,‘) def to_url(self, values): return ‘,‘.join(BaseConverter.to_url(value) for value in values) app = Flask(__name__) app.url_map.converters[‘list‘] = ListConverter @app.route("/list/<list:data>/") def test_list(data): return ‘‘.join(data)
默认就是调用converter的to_python方法,只有我们继承BaseConverter来写子类,并重写to_python和to_url方法就OK了。这里只是一个简单的示例。
更深入的学习的话需要看一些Werkzeug的document。
Flask实例教程三
时间: 2024-10-26 20:30:04