当前位置 : 主页 > 编程语言 > python >

Flask中视图函数的路由

来源:互联网 收集:自由互联 发布时间:2022-06-20
修改访问地址 默认flask启动是127.0.0.1:5000地址,我想通过本机ip地址:5000 端口访问,如何修改呢? 在程序启动时,添加参数即可 app.run(host="192.168.1.103",port="5000") 此时127.0.0.1的地址就访问

修改访问地址

默认flask启动是127.0.0.1:5000地址,我想通过本机ip地址:5000 端口访问,如何修改呢?

在程序启动时,添加参数即可

app.run(host="192.168.1.103",port="5000")

Flask中视图函数的路由_flask此时127.0.0.1的地址就访问不了了

可以通过修改host为0.0.0.0 来设置所有来自这个主机ip的访问,也就是访问127和192都可以

app.run(host="0.0.0.0",port="5000")

Flask中视图函数的路由_python_02

手动设置debug在启动函数参数内,其他配置文件参数还是在别处设置

app.run(host="0.0.0.0",port="5000",debug=True)



设置请求方式访问路由函数(通过methods来限定访问方式)

一般设置绑定视图函数时,默认都是以GET方式访问该路由路径,才会进入视图函数中

Map([<Rule '/' (GET, HEAD, OPTIONS) -> index>,

这里就是个路由对象,表示路由路径 “/”以GET、HEAD、OPTIONS 访问可以进入视图函数

Flask中视图函数的路由_flask_03

那么现在想改成POST访问才能进入,别的方式不行

只需在绑定路由的时候设置method参数即可,参数是列表格式

@app.route("/post_url",methods=["POST"])
def post_url():
return "这是以POST方式进入的视图函数"

此时在前台直接访问路径,也就是GET方式

Flask中视图函数的路由_python_04提示Not Allowed,不允许以此方式访问

POST方式

Flask中视图函数的路由_正则_05

如果想要指定允许多个方式访问,直接加入列表即可

@app.route("/post_url",methods=["GET","POST"])



多个路由路径一样,该访问哪个视图函数?

其实很好理解,比如定义了好几个hello路由路径和视图函数,在访问时,会先从路由列表中选择第一个出现的路由对应的视图函数进行执行。

@app.route('/hello')
def hello():
return 'hello 1'

@app.route('/hello')
def hello2():
return 'hello 2'

print(app.url_map) 即可在启动时,列出路由列表,访问时进入第一个出现的,输出hello 1

即 进入hello视图方法中

Flask中视图函数的路由_python_06

如果要访问hello2视图方法,要把访问方式与hello区别开,即一个get,一个post

Flask中视图函数的路由_正则_07Flask中视图函数的路由_python_08



一个视图函数绑定多个路由路径

路由路径可以共用视图函数,需要几个就加几个

@app.route('/hi1')
@app.route('/hi2')
def hi():
return "hi page"

Flask中视图函数的路由_正则_09Flask中视图函数的路由_python_10




反解析路径和302跳转

redirect(url)    跟要跳转到的路径,需要导入方法

url_for(def)      反解析视图函数对应的路径名,需要导入方法

例:

from flask import Flask, url_for , redirect

@app.route('/login')
def denglu():
pass
url = url_for("denglu") # 获取denglu视图函数绑定的路由路径 login
return redirect(url) # 即跳转到/login路径,进入login路由路径对应的视图方法中

也可以redirect直接跟路由路径,但不推荐此方法,因为在项目中如果路由路径改掉,那么所有的redirect跟着的路径都要修改掉。

from flask import Flask, url_for , redirect

app = Flask(__name__)

@app.route('/')
def index():
"""定义的视图函数"""
return "hello flask"

@app.route('/login')
def login():
url = url_for('index')
return redirect(url)

if __name__ == '__main__':
app.run(debug=True)

访问即跳转到主页

Flask中视图函数的路由_python_11




路由提取参数

在进行商品id获取的时候,要正确的获取网页传来的id,并传入进视图函数,应该怎么做呢?

from flask import Flask
app = Flask(__name__)
@app.route("/goods/<int:goods_id>")
def goods_detail(goods_id):
return "goods detail page id: %s" % goods_id

当用户输入​​http://127.0.0.1:5000/goods/123​​ 时,程序会检测到正则的格式为int,进行匹配是否为int整型,为真则将123赋给goods_id,并带入到视图函数中

<int>     在这相当于一个整型转换器

Flask中视图函数的路由_正则_12

如果没有输入或者输入的不是整型数字,则404

Flask中视图函数的路由_python_13Flask中视图函数的路由_正则_14

@app.route("/goods/<goods_id>")

如果不加转换器默认是字符串类型,所以要严格匹配用户的输入

Flask中视图函数的路由_flask_15Flask中视图函数的路由_flask_16



定义自己的转换器

有时候需要接受匹配的值flask内置的匹配规则无法正确匹配,那么就需要进行自己编写一个转换器

转换器是以类的方式定义的

1、定义自己的转换器

导入werkzeug.routing模块的基类方法BaseConverter

...
from werkzeug.routing import BaseConverter

...

class RegexConverter(BaseConverter):
"""定义自己的转换器"""
pass

2、将定义的转换器加入到flask应用中

# 2、使用app.url_map.converter将定义的转换器添加到flask应用中
app.url_map.converter["re"] = RegexConverter

3、使用类转换器

@app.route("/goods/<re:mobile>")


万能转换器

self.regex         # 内置的正则属性,flask在匹配时默认会调用此属性规则进行匹配

super(子类 , self).__init__()    调用该子类的父类的初始化方法

app.url_map.converters["re"] = RegexConverter            # 在flask应用中添加一个转换器,名为re,对应的类为RegexConverter

代码:

from flask import Flask,redirect,url_for
from werkzeug.routing import BaseConverter

app = Flask(__name__)

@app.route('/')
def index():
return "hello flask"

# http://127.0.0.1:5000/send/15020266666
# 这里使用整型和其他类型都不能满足需求,所以自己写一个转换器进行匹配
# 1、定义自己的转换器
class RegexConverter(BaseConverter):
def __init__(self,url_map,regex):
# 调用父类的初始化方法接收整个映射路由路径
super(RegexConverter, self).__init__(url_map)
# 将正则表达式规则保存到 self.regex 内置正则属性中,flask在进行匹配时就会调用这个属性
self.regex = regex

# 2、添加转换器到flask应用中,此时转换器名字为re
app.url_map.converters["re"] = RegexConverter

# 3、使用类转换器re进行传入的数据匹配,并将成功的结果赋给mobile
@app.route("/sends/<re(r'1[3458]\d{9}'):mobile>")
def send_sms(mobile):
return "send sms to %s" % mobile


if __name__ == '__main__':
app.run(debug=True)

流程:

1、当用户访问 http://127.0.0.1:5000/sends/15020263188 时,会将传来的数据和定义的转换器规则进行匹配,此时获得定义的转换器是 re,并且括号参数内带有规则

2、从flask应用中去寻找re转换器,定位到RegexConverter类,创建这个对象并执行代码

3、对象中 创建初始化方法接收转换器传来的数据,分别为

第一个参数 整个路由列表(url_map) 和

第二个参数 正则表达式(regex)

这是固定的参数

① 接着使用基类方法接收整个路由列表,这个url_map就是供父类使用的

② 再使用当前类 self.regex 接收正则表达式保存到属性中,flask会使用这个内置属性进行路由的正则匹配,self.regex 是固定的成员,是由基类继承下来的

Flask中视图函数的路由_flask_17Flask中视图函数的路由_python_18

可以在转换器参数加正则,也可以直接将正则写入到类转换器内。

大部分情况下都是使用带参数的

@app.route("/sends/<re(r'1[3589]\d{9}')>")

方便控制和多次调用。

Flask中视图函数的路由_python_19Flask中视图函数的路由_正则_20



to_python和to_url

前面提到了在正则匹配时,进入到了类对象中,如果匹配成功,返回出来给一个变量

这期间并不是直接返回的,而是经过了BaseConverter基类中的to_python内置方法

class MobileConverter(BaseConverter):
def __init__(self,url_map):
super(MobileConverter,self).__init__(url_map)
self.regex = r'1[3589]\d{9}'

# 在没有进行其他操作时,类转换器匹配成功后会经过to_python直接返回出来
def to_python(self,value):
return value

在没有进行其他操作时,类转换器匹配成功后会经过to_python直接返回出来

如果要对匹配后的数据进行一些其他操作或者过滤等,可直接在to_python方法中修改

class RegexConverter(BaseConverter):
# 3
def __init__(self,url_map):
super(RegexConverter, self).__init__(url_map)
self.regex = r'1[3589]\d{9}'

def to_python(self,value):
print("调用了to_python方法")
return "abc"

Flask中视图函数的路由_正则_21



to_url    接收url_for传入的第二个参数

注意url_for(xxx,mobile="")    这里的mobile要和上面绑定地址那里返回的变量名一样

from flask import Flask,request,redirect,url_for
from werkzeug.routing import BaseConverter

app = Flask(__name__)

# 自定义转换器用来匹配手机号
class MobileConverter(BaseConverter):
def __init__(self,url_map,regex):
super(MobileConverter, self).__init__(url_map)
self.regex = regex
def to_python(self,value):
return value
def to_url(self,value):
return value
# 添加转换器到flask应用中
app.url_map.converters["re"] = MobileConverter

@app.route("/send/<re(r'1[3578]\d{9}'):mobile>")
def send_sms(mobile):
return "send sms to %s" % mobile

@app.route("/send302")
def send302():
url = url_for("send_sms",mobile="13561223020")
return redirect(url)

if __name__ == '__main__':
app.run(debug=True)

此时访问http://127.0.0.1:5000/send302 页面返回404

流程:

访问/send302时,url_for反解析sends_sms视图函数的路由路径,并把url参数带入到后面进入re转换器中,转换器进入MobileConverter类中匹配一遍后 如果成功则进入到to_url中,此时to_url返回的value和/sends/拼接路径,然后redirect跳转进入这个路由路径的视图函数内。接着进入to_python方法中返回最终的值

Flask中视图函数的路由_flask_22

Flask中视图函数的路由_正则_23

to_python和to_url 是根据传来的方式不同,进行匹配成功后进入的方法



上一篇:Flask之Request对象
下一篇:没有了
网友评论