- 标准的flask目录
- Flask函数常用参数
- 路由请求类型methods
- 指定加载配置数据
- 查看所有路由信息app.url_map
- window
- linux
- Flask默认有三种请求
- 蓝图blueprint
- 转换器converters
- 错误处理 errorhandle
pip list 查看安装了哪些库
pip freeze > 文件名.txt 将已经安装的第三方库导入到本地文件(项目路径中)
pip install -r 文件名 循环遍历导出的依赖库 标准的flask目录
- static:下面存放静态资源
- templates: 用于存放要选渲染的资源,一般为html (路径在flask程序的同级目录中) (render_template)
flask的helloworld快速上手
分析:
- 首先导入依赖
- 初始化flask返回给变量app
- 使用@app.route设置路由(编写函数,解析路由)
- 启动app
一般初始化函数时,使用Flask(name) => 这个__name__会解析到当前类,然后将当前类所在的包设为主项目(可以访问static templates)。
Flask(name,**)
Flask后还有三个常用的参数。
- static_folder=“文件夹名” => 将static文件夹名字进行更改。默认是static
- static_url_path = “/访问路径” => 将访问页面 localhost:5000/static/* 修改成 localhost:5000/修改后的访问路径/*
- template_folder = “文件夹名” => 将template文件夹名字进行更改。默认是template
设置可以使用post请求访问
@app.route('/',methods=["Get","Post"])
路由参数,指定参数类型为int
@app.route("/order/")
def getOrderId(orderId):
return "orderId : %s"%orderId
指定加载配置数据
- 从配置对象加载 from_object
- 从本地配置类中加载 from_pyfile
- 从环境变量加载 from_envvar
- app.confg[‘配置’] = “”
配置大写如:SECRET_KEY
- 设置配置 app.confg[‘配置’] = “”
获取的话,就是字典。如 - 查询配置
print(app.confg.get("")) print(app.config[""])
from flask import Flask
from config import config
app = Flask(__name__)
# 第一种
# app.config["SECRET_KEY"] = "hujinmg"
# 第二种
# app.config.from_object(config)
# 第三种
# app.config.from_pyfile("config2.py")
# 第四种
app.config.from_envvar("PROJECT",silent=True)
@app.route("/")
def index():
print(app.config.get("SECRET_KEY"))
return f"SECRET_KEY = {app.config.get('SECRET_KEY')}"
if __name__ == '__main__':
app.run(debug=True)
新版方式,可以不用写app.run(),使用flask run进行启动,需要传入环境变量用于指定是启动那个文件。
flask run == python.exe -m flask run
- 第一种
set FLASK_APP=hello.py
linuxexport FLASK_APP=hello.py
windows设置环境变量
set 变量名=变量值
linux设置环境变量
export 环境变量=变量值
2. 第二种
print(app.url_map)
GET HEAD OPTIONS
405 方法不允许
@app.route("/1",methods=['post'])
def index():
return "111"
print(app.url_map)
如果只有methods=[‘Post’]的话
使用app.url_map可以产看到,只支持Options和Post,没有Get了。
Map([蓝图blueprintindex>, ' (OPTIONS, HEAD, GET) -> static>])
使用蓝图可以创建一个蓝图Blueprint里面可以编写 名字,name
- 使用蓝图
- user = Blueprint(“user”,name) # 创建蓝图对象
- @user.route("/") # 使用创建好的对象进行添加路由
- 注册蓝图 app.register_blueprint(user,url_prefix="/路径") # 在app主启动类中,注册蓝图并添加访问url路径前缀
- 蓝图导入
一般将蓝图配置放到__init__中。需要注意的是要将文件导入进去。
解决办法是:在__init__初始化类中,导入views这个路由类。这样在from goods import goods_bp时会加载__init__类中的内容。__init__类中在去加载views类。
蓝图内部的静态文件,必须要显示指出。没有默认的。和Flask函数的参数一样
代码展示
from flask import Flask
# werkzeug => 工具
from werkzeug.routing import baseConverter
app = Flask(__name__)
# 使用系统自带的int转换器。
@app.route("/user/")
def converter(userid):
print("userid type is {}".format(type(userid)))
return "userid is {}".format(userid)
# 自定义类,继承自baseConver,重写regex属性。
class MyConverter(baseConverter):
# regex正则。
# 1[3-9] =》 1开头 [3-9](3-9之间的数) d 数字 d{9}表示任意9个数
regex = r"1[3-9]d{9}"
# url_map中的converters是个字典
app.url_map.converters["myPhoneNum"] = MyConverter
# 自定义converter,实现限制接口为/user/手机号(11位)
@app.route("/phone/")
def myConverter(phoneNum):
print("type is {}".format(type(phoneNum)))
return "phone num is => {} ".format(phoneNum)
# 查看自带的转换器
print(app.url_map.converters.get("int")) #
print(app.url_map.converters.get("string")) #
converter(转换器)文本描述。
flask作为轻型WEB框架,在web开发中,可能会出现限制用户访问的规则的场景,那么这个时候,就需要过滤指定用户,所以可以使用转换器实现。
转换器的本质是:通过正则表达式匹配路由地址
flask 系统自带的转换器有
DEFAULT_ConVERTERS = {
'default': => UnicodeConverter,
'string': => UnicodeConverter,
'any': => AnyConverter,
'path': => PathConverter,
'int': => IntegerConverter,
'float': => FloatConverter,
'uuid': => UUIDConverter,
}
转换器总结:
- 使用系统自带的转换器。
只用在动态的接口前加个 系统自带的转换器即可 如 int:url变量 - 自定义转换器
当系统自带的转换器不能满足需求时,我们就要自定义转换器。分为以下步骤
- 导入包 from werkzeug.routing import baseConverter
- 自定义类继承自baseConverter,重写regex属性
- 使用app.url_map.converters[key] = 自定义类
- 在动态url变量前 限制即可。 如@app.route("/phone/myPhoneNum:phoneNum")
本来如果报错的话前端页面会显示出英文错误。可以设置请求报错时的显示。
app.errorhandle(404)
代码
from flask import Flask
# werkzeug => 工具
from werkzeug.routing import baseConverter
app = Flask(__name__)
@app.errorhandler(500)
def error500(e):
print(e)
return "500错误"
@app.errorhandler(404)
def error404(e):
print(e)
return "404页面走丢了"
@app.errorhandler(ZeroDivisionError)
def zeroDivisionError(e):
print(e)
return "除数不能为零"
@app.route("/zero")
def zero():
1 / 0
return "1/0"
@app.route("/user/")
def converter(userid):
print("userid type is {}".format(type(userid)))
return "userid is {}".format(userid)
class MyConverter(baseConverter):
# regex正则。
# 1[3-9] =》 1开头 [3-9](3-9之间的数) d 数字 d{9}表示任意9个数
regex = r"1[3-9]d{9}"
# url_map中的converters是个字典
app.url_map.converters["myPhoneNum"] = MyConverter
# 自定义converter,实现限制接口为/user/手机号(11位)
@app.route("/phone/")
def myConverter(phoneNum):
print("type is {}".format(type(phoneNum)))
return "phone num is => {} ".format(phoneNum)
# 查看自带的转换器
print(app.url_map.converters.get("int")) #
print(app.url_map.converters.get("string")) #



