java中的接口是类吗
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([
这里就是个路由对象,表示路由路径 “/”以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/
当用户输入时,程序会检测到正则的格式为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/
流程:
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/
此时访问页面返回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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~