Python day38_Flask入门

作者: g_s_007 | 来源:发表于2018-06-21 22:23 被阅读0次

关于路由

路由传参

有时我们需要将同一类 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地址

相关文章

网友评论

    本文标题:Python day38_Flask入门

    本文链接:https://www.haomeiwen.com/subject/dzfhyftx.html