首页 > 代码库 > Flask实例教程三

Flask实例教程三

一: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请求。

wKiom1OK84KTJ2L-AABH45ATGFw333.jpg

wKioL1OK82rjI-InAABgyVXwTKI416.jpg

wKiom1OK866i2zBLAAFUHWNthOU455.jpg

wKioL1OK85jCA8hwAABbClWT9xM347.jpg

wKiom1OK89ixkdFaAADGXOQhc2c553.jpg

当使用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

wKioL1OK88yQarFWAABvahMIRzg135.jpg

对于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

wKiom1OK9BSwOmuWAABgihOl2SQ368.jpg

默认情况下用户输入一个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)

wKioL1OK9ATA90-ZAABhW3cVUi4927.jpg

默认就是调用converter的to_python方法,只有我们继承BaseConverter来写子类,并重写to_python和to_url方法就OK了。这里只是一个简单的示例。

更深入的学习的话需要看一些Werkzeug的document。


本文出自 “专注linux” 博客,请务必保留此出处http://forlinux.blog.51cto.com/8001278/1420970