flask配置参数、路由、转换器
Flask是python的web框架,最大的特征是轻便
就属于轻量级框架了,它只提供最核心的功能,如果业务变化快,可以选用Flask,自己来搭建符合自己公司业务后端架构。
开始一点一点做笔记。
想学Java的可以关注他,扫码即可。
开始我们的笔记。
新建一个文件夹,然后选择虚拟环境,没有的可以去百度(过几天我再写创建虚拟环境的笔记),哈哈哈,就皮。
有的话,选择一个虚拟环境,先通过pip install flask安装配置环境
开始第一个项目,先跑一个项目
from flask import Flask
#导入包
app = Flask(__name__)
#__name__表示当前的模块名字,确定程序的根目录。里面传什么,flask有一个函数就会把里面传的这个文件确定为根目录,找图片之类的静态文件能够找到,如果写成别的,可能找不到,会报错
#app是Flask的实例,它接收包或者模块的名字作为参数,可以变,但一般都是传递__name__,后面也会详细说一下这个
@app.route("/")#这个是路由,后面会有解释,看了就明白了,先跑项目
def index():#这个就是定义了一个函数,相当于视图
return "index"#这个是访问这个路由返回给页面的东西
if __name__ == "__main__":app.run()
#跑项目
#在控制台就输入python 当前文件的名字 回车就可以,下面是运行的结果
运行结果:
通过代码开启调试模式。这样当我们程序出错的时候,就能知道错误在多少行,方便我们快速定位错误。如果DEBUG=false,运行代码之后,页面会显示报错,但是没有具体的错误。
不开启debug模式
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
print(1 / 0)#这个肯定是错误的
return "index"
if __name__ == "__main__":
app.run()
运行结果:
方法一:类方法配置
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
print(1 / 0)
return "index"
class Config():
DEBUG = True
app.config.from_object(Config)
if __name__ == "__main__":
app.run()
运行结果:
并且可以定位错误
方法二:通过文件配置
先新建一个文件config.cfg,写DEBUG = True
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
print(1 / 0)
return "index"
# class Config():
# DEBUG = True
# app.config.from_object(Config)app.config.from_pyfile("config.cfg")
#直接写上文件的名字
if __name__ == "__main__":
app.run()
运行结果:和第一种方法运行下来的是一样的
方法三:直接操作
app.config['DEBUG'] = True
config本质上就是一个字典,你可以按住ctrl,用鼠标点进去看一下。字典的话可以根据键来赋值。
方法四:对象上操作
app.debug = True
方法五:直接传入参数操作(只限制于DEBUG参数)
if __name__ == "__main__":
app.run(DEBUG=True)
重点:如果DEBUG是关闭的状态,每一次运行都需要自己手动重启。
在刚刚创建的config文件中输入AGE =10,在视图中取出来。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
print(app.config.get('AGE'))
#config是字典,所以取值就根据键取值就好
return "index"
@app.route("/center")
def center():
print(app.config.get('AGE'))
return 'center'
app.config.from_pyfile("config.cfg")
app.debug = True
if __name__ == "__main__":
app.run()
运行结果:
还有一种方法,要导入一下
from flask import Flask,current_app
@app.route("/center")
def center():
print(app.config.get('AGE'))
print(current_app.config.get('AGE'))
#如果当前的视图比较多,我们不会写在一个文件下,这个时候取参数的话,就得通过current_app取值,表示当前的app下return 'center'
if __name__ == "__main__":
app.run(host='0.0.0.0',port='5000')
host表示本机上的任意一个ip,port表示任意一个端口,可以通过ifconfig
命令查看自己的本机IP(linux),Windows下通过ipconfig查找。
然后直接在浏览器输入你查到的ip:5000就可以访问
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "index"
@app.route("/center")
def center():
return 'center'
app.config.from_pyfile("config.cfg")
app.debug = True
if __name__ == "__main__":
app.run()
访问路由运行结果
比如我们访问index首页的时候,页面自动跳转到center页面。(有时候在网页上我们登录成功之后,页面就会自动跳转到首页,这个就是重定向)
from flask import Flask,url_for,redirect
#url_for里面的参数是函数的名字
#rediect是表示重定向
app = Flask(__name__)
@app.route("/")
def index():
return redirect(url_for('center'))
@app.route("/center")
def center():
return 'center'
app.config.from_pyfile("config.cfg")
app.debug = True
if __name__ == "__main__":
app.run()
这个表示访问首页的时候,重定向到center页面,然后页面上显示的是center。
常见的浏览器的请求方式有:
get:获取资源
post:新增资源
put:更新资源(修改资源)
delete:删除资源
options:询问支持的方法
在登录界面一般用post方法,但是如果在postman中用get方法去访问的话,是不允许的,这个时候我们可以设置,把他改成允许。
from flask import Flask,url_for,redirect
#url_for里面的参数是函数的名字
#rediect是表示重定向
app = Flask(__name__)
@app.route("/login",methods=['POST','GET',])
def index():
return redirect(url_for('center'))
@app.route("/center")
def center():
return 'center'
app.config.from_pyfile("config.cfg")
app.debug = True
if __name__ == "__main__":
app.run()
运行结果:
转换器的作用可以取到url后面的参数
flask支持的转换器有:default、string、int、floa、uuid、path(和default、string不同的是,它可以匹配斜线)
举一个例子:
from flask import Flask,url_for,redirect
#url_for里面的参数是函数的名字
#rediect是表示重定向
app = Flask(__name__)@app.route("/center/<int:id>")
#规定参数必须是整数
def center(id):
return "你的id是%s" % id#取参数
app.config.from_pyfile("config.cfg")
app.debug = True
if __name__ == "__main__":
app.run()
如果传的是整数的话
但是如果传-1的话就会报错,要想不报错,得加:
@app.route("/center/<int(signed=True):id>")
这样的话,也可以取到负数
uuid是不重复的通用的唯一标识,可以在后端输入python,import uuid导入uuid模块,然后,uuid.uuid4()回车一下,就可以生成一个,可以写一个转换器,验证一下。
转换器的原理就是一个正则
转换器的源码:
from werkzeug.routing import BaseConverter
可以ctrl,鼠标点进去看看
from flask import Flask,url_for,redirect
#url_for里面的参数是函数的名字
#rediect是表示重定向
from werkzeug.routing import BaseConverter
app = Flask(__name__)
class MyConverter(BaseConverter):#一定要继承基类
regex = '1[23456789]\d{9}'app.url_map.converters['re'] = MyConverter
#把自定义的转换器加到这个里面
@app.route("/center/<re:id>")
def center(id):
return "你的id是%s" % id
app.config.from_pyfile("config.cfg")
app.debug = True
if __name__ == "__main__":
app.run()
随机在网址上输入11位数就可以,运行结果:
from flask import Flask,url_for,redirect
#url_for里面的参数是函数的名字
#rediect是表示重定向
from werkzeug.routing import BaseConverter
app = Flask(__name__)
class MyConverter(BaseConverter):
def __init__(self,map,re):
#map是默认的参数,re就是你传进来的参数,你传进来什么,就是什么
super().__init__(map)
self.regex = re
app.url_map.converters['re'] = MyConverter
@app.route("/center/<re('1[2345678]\d{9}'):id>")
def center(id):
return "你的电话号是%s" % id
@app.route("/center1/<re('\d{5}'):id>")
def center1(id):
return "你的id是%s" % id
app.config.from_pyfile("config.cfg")
app.debug = True
if __name__ == "__main__":
app.run()
运行结果看一下:
class MyConverter(BaseConverter):
def __init__(self,map,re):
#map是默认的参数,re就是你传进来的参数,你传进来什么,就是什么
super().__init__(map)
self.regex = re
def to_python(self, value):
return '微微摘录'
在上面的基础上添加重写to_python的方法
运行结果:
from flask import Flask,url_for,redirect
#url_for里面的参数是函数的名字
#rediect是表示重定向
from werkzeug.routing import BaseConverter
app = Flask(__name__)
class MyConverter(BaseConverter):
def __init__(self,map,re):
#map是默认的参数,re就是你传进来的参数,你传进来什么,就是什么
super().__init__(map)
self.regex = re
def to_python(self, value):
return value
def to_url(self, value):
return value
app.url_map.converters['re'] = MyConverter
@app.route("/center/<re('1[2345678]\d{9}'):id>")
def center(id):
return redirect(url_for('center1',id='13567'))
#重定向到center1,但是center1有参数,所以需要传值
@app.route("/center1/<re('\d{5}'):id>")
def center1(id):
return "你的id是%s" % id
app.config.from_pyfile("config.cfg")
app.debug = True
if __name__ == "__main__":
app.run()
正常情况下的运行结果:
其中的逻辑:
如果改了
def to_url(self, value):
return "67890"
再次去访问:
里面的逻辑大概是这个样子的,
这期笔记就到这里了,可以的话可以点点在看~~~
如果发现了有什么错误的地方,欢迎你到留言区纠正哦