一、配置文件
1.应用程序配置
# 1.直接使用配置字典config
# app.config['DEBUG'] = True 开启debug模式
# app.config['ENV'] = "development" 调试开发和生产环境
# app.config["SECRET_KEY"] = "sdjkfwiuriwqrjkjsfnn,qoi" 用于签名和加密
from flask import Flask
app = Flask(__name__)
# 应用程序配置
# 1.直接使用配置字典config
app.config['DEBUG'] = True
app.config['ENV'] = "development"
app.config["SECRET_KEY"] = "sdjkfwiuriwqrjkjsfnn,qoi"
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
2.加载配置文件
#app.py
from flask import Flask
app = Flask(__name__)
# 2 加载配置文件
app.config.from_pyfile("settings.py")
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
#settings.py
# 调试模式,修改代码会自动重启服务器
DEBUG = True
# 设定服务器的地址和端口
SERVER_NAME = "127.0.0.1:9009"
# 用于签名和加密
SECRET_KEY = "sjkdfksdklfsdm,fm,wrio3wiorwiojrejioewrdm,as,md"
3.使用类进行配置(使用对象)
实用类的好处,继承。可以继承公共文件
#app.py
# 3.使用类进行配置
from settings1 import Development
app.config.from_object(Development)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
#settings1.py
# 公共配置
class BaseConfig:
SECRET_KEY = "sjkdfksdklfsdm,fm,wrio3wiorwiojrejioewrdm,as,md"
class Development(BaseConfig):
DEBUG = True
SERVER_NAME = "127.0.0.1:7007"
4.flask-script插件
简单来说,就是flask终端启动的参解析器;这样就可以不改代码完成不同方式的启动。
4.1.安装
pip install flask-script
4.2.使用
-?, --help # 查看帮助
-h, --host # 指定主机
-p, --port # 指定端口
-d # 开启调试模式
-r # 自动加载
eg: python app2.py runserver -d -p 8008
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
# 实例管理器对象,负责接收终端传来的参数,解释
manager = Manager(app)
@app.route("/")
def index():
return "Hello world"
if __name__ == '__main__':
# -d 调试模式 -h 服务器地址 -p 端口号
# python app2.py runserver -d -p 8008
manager.run()
二、路由
1.无参路由
#app.py
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
# 实例管理器对象,负责接收终端传来的参数,解释
manager = Manager(app)
@app.route("/")
def index():
return "Hello world"
if __name__ == '__main__':
manager.run()
2.带一个参数的路由地址
#app.py
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
# 实例管理器对象,负责接收终端传来的参数,解释
manager = Manager(app)
# 带参数路由,通过路由传参
@app.route('/list/<name>/')
def list(name):
return "Hello:" + name
if __name__ == '__main__':
manager.run()
3.限制参数值的路由
参数类型:string、int、path类型、float类型
路由规则:
1、必须以/开头
2、最好以/结尾,如果不以斜线结尾,请求路径中末尾不能带斜线
eg:
@app.route('/list/<name>')
http://127.0.0.1:8009/list/tom/ 会报错
#app.py
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
# 实例管理器对象,负责接收终端传来的参数,解释
manager = Manager(app)
# 1.string类型,默认的是
# string参数:<参数名>
@app.route('/show/<name>/')
def show(name):
"""
:param name: 视图函数的参数名必须和路由参数的参数名一致
:return:
"""
print(name)
return name
if __name__ == '__main__':
manager.run()
# 2 整型参数
# 整数参数: <int:参数名>
@app.route("/param/<int:age>/")
def get_para(age):
print(type(age),age)
return str(age)
#传入其他参数会报错
# 3.path类型: (针对参数中包含/的情况)
#如果参数字符串中包含/,可以path类型,path类型可以把/当普通字符
# path参数:<path:参数名>
# eg: http://127.0.0.1:8009/route/c:/python/
@app.route("/route/<path:c>")
def route(c):
return c
# 4.float类型参数
# float参数:<float:参数名>
@app.route("/money/<float:money>")
def get_money(money):
print(type(money))
return str(money)
#其他类型报错,整数报错
三、重定向redirect
1.作用
通过重定向,实现从一个视图函数跳转到另一个视图函数的操作
2.导入重定向
from flask import Flask, redirect, url_for
说明
1. redirect 参数为要跳转的路由地址
2. url_for 函数用于构建指定函数的URL。 它把函数名称作为第一个参数。它可以接受任意个关键字参数,每个关键字参数对应URL中的变量。未知变量将添加URL中作为查询参数。
3. 组合使用redirect(url_for(endpoint,**values))
3.实例
#app.py
from flask import Flask,redirect
from flask_script import Manager
app = Flask(__name__)
# 实例管理器对象,负责接收终端传来的参数,解释
manager = Manager(app)
@app.route('/direct/')
def direct():
print("direct")
#重定向,redirect("请求路径")
return redirect('/list/tom/') #常量情况
#变量情况
name = 'admin'
return redirect('/list/{}/'.format(name))
if __name__ == '__main__':
manager.run()
4.url_for
# url_for('函数名',参数名1=value,参数名1=value,...)
# 功能: 根据函数名求出请求路径
# 多余的参数会变成get传参
# 请求路径一般是内部,但不局限于内部
#app.py
from flask import Flask,redirect,url_for
from flask_script import Manager
app = Flask(__name__)
# 实例管理器对象,负责接收终端传来的参数,解释
manager = Manager(app)
# 多参数的 url_for情况
@app.route('/show/<name>/<int:age>/')
def show(name, age):
print(name)
return name
@app.route('/direct/')
def direct():
print("direct")
#重定向,redirect("请求路径")
#常量情况
return redirect('/list/tom/')
#变量情况
name = 'admin'
return redirect('/list/{}/'.format(name))
#不带参数
print(url_for('index')) # index对应的路由是 "/"
#带参数情况
# 参数应该使用关键字参数传递
print(url_for('list',name='admin')) #/list/admin/
print(url_for('show',name='tom',age=20)) # /show/tom/20/
# 多余的参数会变成get传参
return redirect(url_for('list',name='哈哈',sex='男'))
# 请求路径一般是内部,但不局限于内部
return redirect("http://www.baidu.com")
if __name__ == '__main__':
manager.run()
四、abort通过抛出状态码判断错误信息
1.导入
from flask import abort
2.说明
和raise 类似 上面的代码正常执行 下面代码不再执行
3.实例
from flask import Flask, abort
from flask_script import Manager
app = Flask(__name__)
# 实例管理器对象,负责接收终端传来的参数,解释
manager = Manager(app)
@app.route("/")
def index():
return "Hello world"
# 抛出异常
@app.route('/error/')
def handle_error():
abort(500) # 抛异常,后面代码不再执行
# abort(403)
#渲染页面
@app.errorhandler(500)
def handle_500(err):
return "{name}是不是睡着,{name}的代码完蛋了".format(name="程序猿")
if __name__ == '__main__':
manager.run()
五、蓝图的使用
当大量的视图函数放在一个文件中,很明显是不合适。需将相关的视图函数放在单独的文件中。蓝图就是为了解决这个问题而出现的。防止循环引用
1.安装蓝图
pip install blueprint
1.1.导入蓝图、注册蓝图,也可以指定路由前缀(优先级更高)
#app.py
from flask import Flask
#导入蓝图对象
from views import bp
app = Flask(__name__)
#注册函数
#app.register_blueprint(bp)
app.register_blueprint(bp,url_prefix='/bp')
#指定路由前缀便于区分每个模块的重复路径,也可以写于views
if __name__ == '__main__':
app.run()
1.2.蓝图对象
# views.py
# 蓝图对象
# Blueprint(self,name,import_name)
# name是蓝图名称,不要重名
# import_name 模块名
# url_prefix 路由前缀: 以/开头,结尾不要有/
# 视图函数不能重名
bp = Blueprint('bp',__name__,url_prefix='/bp')
# 视图函数不能重名
@bp.route('/')
def hello_world():
return 'Hello World!'
#视图函数不能重名
@bp.route('/hello/')
def hello():
return '你好我的世界'