关于路由
路由传参
有时我们需要将同一类 URL 映射到同一个视图函数处理。这时我们可以使用路由传参:
# 使用尖括号包裹的部分就是可以动态传递的参数
# 必须将参数名传给函数
@app.route('/phone/<mobile>')
def phone(mobile):
return 'user mobile: %s'% mobile
路由传递的参数默认当做 string 处理,也可以指定参数的类型:
# int 代表使用 IntegerConverter 去处理 url 传入的参数
@app.route('/phone/<int:mobile>')
def phone(mobile):
return 'user mobile: %s'% mobile
正则匹配路由
在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问
自定义转换器:
具体实现步骤为:
- 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
- 自定义转换器:自定义类继承于转换器基类
- 添加转换器到默认的转换器字典中
- 使用自定义转换器实现自定义匹配规则
实现代码:
# 1. 导入转换器基类
# BaseConverter 是所有转换器的基类
from flask import Flask
from werkzeug.routing import BaseConverter
# 2. 自定义转换器 继承BaseConverter
class RegexConverter(BaseConverter):
# __init__传参 第一个必须是map参数,后面是你自己的扩充参数
def __init__(self,url_map,*args):
# 继承父类方法 传入url_map
super(RegexConverter, self).__init__(url_map)
# 重写regex ,赋值你自己的扩充参数,自定义规则
self.regex = args[0]
app = Flask(__name__)
# 3. 将自定义的转换器类添加到默认转化器字典中,并命名为re
# 存放所有转换器的字典:converters
app.url_map.converters['re'] = RegexConverter
# 4. 使用自定义转换器实现自定义匹配规则
@app.route('/login/<re("1[3456789][0-9]{9}"):mobile>')
def login(mobile):
return 'login: %s' % mobile
if __name__ == '__main__':
app.run(debug=True)
系统自带转换器:
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
系统自带的转换器具体使用方式在每种转换器的注释代码中有写,请留意每种转换器初始化的参数 (ctrl+b可查看源码)
转换器中的两个函数:
1、to_python
在程序运行时 首先会调用to_python 然后才会到视图函数 可以在进入视图函数前对数据进行一些处理 比如将字符串类型转换为int类型
2、to_url
在使用url_for去获取视图函数所对应的url的时候,会调用此方法,对url_for后面传入的视图函数参数做进一步处理
**具体参看 flask003 文件夹 **
指定请求方式
在 Flask 中,定义一个路由,默认的请求方式为:
- GET
- OPTIONS(自带)
- HEAD(自带)
如果想添加请求方式,使用methods属性
@app.route('/',methods = ['GET','POST'])
def index():
return 'index'
视图常用逻辑
返回json数据
在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中可以直接使用 jsonify 生成一个 JSON 的响应
需要导入模块:jsonify
方式一:
@app.route('/data',methods=['GET','POST'])
def data():
dict = {
'user':'zs',
'age':18
}
return jsonify(dict)
方式二:
@app.route('/data',methods=['GET','POST'])
def data():
return jsonify(user= 'zs',age= 18)
注意:json.dump 也可以返回json数据,但是 差别在于jsonify, 设置了content-Type为application/json, 默认text/html
重定向
需要导入模块: redirect
使用一,重定向到一个固定网址
重定向到baidu :
@app.route('/haha')
def hello_world():
return redirect('http://www.baidu.com')
使用二:重定向到自己写的视图函数 配合url_for使用
需要导入模块url_for
@app.route('/login/<int:mobile>')
def register(mobile):
return 'login: %s' % mobile
@app.route('/user_info')
def user_info():
# url_for(),第一个参数是要重定向网址的视图函数名,第二个参数是 重定向路由的动态参数
return redirect(url_for('register',mobile=133))
上述代码,当访问user_info地址的时候,会重定向到login地址
网友评论