Flask中视图函数的路由(flask路由配置)

网友投稿 365 2022-08-28


Flask中视图函数的路由(flask路由配置)

修改访问地址

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

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

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

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

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

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

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

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

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

Map([ index>,

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

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

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

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

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

POST方式

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

@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视图方法中

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

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

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

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

反解析路径和302跳转

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

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

例:

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

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

from flask import Flask, url_for , redirectapp = 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)

访问即跳转到主页

路由提取参数

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

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

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

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

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

@app.route("/goods/")

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

定义自己的转换器

有时候需要接受匹配的值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/")

万能转换器

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

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

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

代码:

from flask import Flask,redirect,url_forfrom werkzeug.routing import BaseConverterapp = Flask(__name__)@app.route('/')def index(): return "hello flask"# 这里使用整型和其他类型都不能满足需求,所以自己写一个转换器进行匹配# 1、定义自己的转换器class RegexConverter(BaseConverter): def __init__(self,url_map,regex): # 调用父类的初始化方法接收整个映射路由路径 super(RegexConverter, self).__init__(url_map) # 将正则表达式规则保存到 self.regex 内置正则属性中,flask在进行匹配时就会调用这个属性 self.regex = regex# 2、添加转换器到flask应用中,此时转换器名字为reapp.url_map.converters["re"] = RegexConverter# 3、使用类转换器re进行传入的数据匹配,并将成功的结果赋给mobile@app.route("/sends/")def send_sms(mobile): return "send sms to %s" % mobileif __name__ == '__main__': app.run(debug=True)

流程:

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

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

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

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

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

这是固定的参数

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

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

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

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

@app.route("/sends/")

方便控制和多次调用。

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"

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

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

from flask import Flask,request,redirect,url_forfrom werkzeug.routing import BaseConverterapp = 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/")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)

此时访问页面返回404

流程:

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

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Flask之Request对象(flask request.data获取)
下一篇:java executor包参数处理功能
相关文章

 发表评论

暂时没有评论,来抢沙发吧~