Flask之基础(2)
路由系统
路由系统:
@app.route('/', methods=['GET,', 'POST'])
1. @app.route()装饰器中的参数
1) methods # 当前URL地址, 允许访问的请求的方式, 默认为GET
2) endpoint # 反向url地址, 默认为视图函数名(url_for)
from flask import url_for
@app.route("/info", methods=["GET", "POST"], endpoint="r_info")
def student_info():
print(url_for("r_info")) # /info
3) defaults # 视图函数的参数默认值 {'nid':1}
@app.route("/info", methods=["GET", "POST"], defaults={"nid": 100})
def student_info(nid):
print(nid) # 100
4) strict_slashes # 是否严格遵循路由地址的结尾 '/url/'
@app.route("/info", strict_slashes=False) # 结尾是否有'/'均可以访问
def student_info():
return "Hello Old boy info"
5) redirect_to # url地址永久重定向(301) 在进入视图函数之前跳转
# 动态路由参数
from flask import url_for
@app.route("/info/<int:nid>", methods=["GET", "POST"], endpoint="r_info")
def student_info(nid):
print(url_for("r_info",nid=2)) # /info/2
return f"Hello Old boy {nid}" # Python3.6的新特性 f"{变量名}"
@app.route("/<dir>/<filename>", methods=["GET", "POST"])
def student_info(dir, filename):
path = os.path.join(dir, filename)
return send_file(path)
<string:nid> --> 字符串的请求参数
<name> --> 接受任何参数
实例化Flask的参数
from flask import Flask
app = Flask(__name__) # type:Flask --> 起提示作用
app.config["DEBUG"] = True # 代码发生改动, 自动重启Flask程序
常用的参数:
template_folder="temp", # 指定模板存放路径 默认值: templates
static_folder="stat", # 指定静态文件存放路径 默认: static
static_url_path="/static" # 指定静态文件访问路径, 默认不写与 static_folder 相同.
static_host=None # 远程静态文件存放服务器
host_matching=False # 遵循主机位匹配 如: http://www.baidu.com/index, 不符匹配不会成功
subdomain_matching=False # subdomain -> sub->子域名 music.baidu.com/music.html 严格遵循子域名访问
详细配置: https://www.cnblogs.com/DragonFire/p/9260299.html
Flask对象配置
Flask的配置:
1. 直接对app.config进行修改
app.config['DEBUG'] = True
2. 使用类的方式导入配置
1) 建立settings.py文件
class FlaskSettings(object):
DEBUG = True
SECRET_KEY = '@#$%^&*()'
2) Flask启动文件中导入
from flask import Flask
from .settings import FlaskSettings
app = Flask(__name__)
app.config.from_object(FlaskSettings)
# 重要的配置
'DEBUG': None,
'TESTING': False,
'SECRET_KEY': None,
'PERMANENT_SESSION_LIFETIME': timedelta(days=31),
'SESSION_COOKIE_NAME': 'session',
'PREFERRED_URL_SCHEME': 'http',
'JSONIFY_MIMETYPE': 'application/json',
蓝图 (Blueprint)
蓝图目录结构
|app # 项目名称, 整个程序的包目录
|- static # 存放静态文件
|- css/js
|- views # 存放蓝图 (视图函数)
|- show_students
|- templates # 存放前端html页面
|- show_students.html
|- __init__.py # 模块初始化文件, Flask程序对象的创建在这个文件里, 在导入引用的包。
|- models.py # 映射数据库表
|- settings.py # 配置文件, 存放配置参数
|manager.py # 与项目名平级, 作为项目启动文件
作用: 作用就是将功能与主服务分开, 一个不能被run的Flask实例, 不存在config
1)views文件中的蓝图
from flask import Blueprint # 导入 Flask 中的蓝图 Blueprint 模块
login = Blueprint("login", __name__, url_prefix="/app")# 实例化一个蓝图(Blueprint)对象
@login.route("/login") # 添加路由和视图函数, 与在Flask对象中相同
def login_func(): # 蓝图内部的视图函数名及route不要出现重复
return "我是蓝图"
url_prefix="/app" # 访问蓝图结构的前缀: /app/login
2) __init__.py中注册蓝图
from flask import Flask
from homework.settings import DebugConfig
from homework.views import login
def create_app():
app = Flask(__name__)
app.config.from_object(DebugConfig)
app.register_blueprint(login.login) # 第一个login: 文件名 第二个: 蓝图实例化对象
return app
3) manage.py 启动文件
from app01 import create_app
app = create_app()
if __name__ == '__main__':
app.run()
特殊装饰器 (中间件)
1. @app.before_request # 在请求(request)进入视图函数之前执行.
@app.before_request
def is_login():
if request.path == "/login":
return None
if not session.get("user"):
return redirect("/login")
2. @app.after_request # 在响应(response)返回客户端之前执行, 结束视图函数之后
@app.after_request
def foot_log(environ):
if request.path != "/login":
return '有客人了!!!'
return environ
3. @app.errorhandler # 重定义错误返回信息
@app.errorhandler(404)
def error404(a):
return send_file('404.jpg')
4) 当程序执行流程正常
before1 -> before2 -> before3 -> views -> after3 -> after2 -> after1
当出现异常情况
before1 -> after3 -> after2 -> after1
from flask_cors import CORS
from flask import Flask
app = Flask(__name__)
CORS(app) # 解决跨域之间的问题
Flask 之 "CBV" 模式
from flask import Flask, views, render_template
app = Flask(__name__)
def wappers(func):
def inner(*args, **kwargs):
ret = func(*args, **kwargs)
return ret
return inner
class Login(views.MethodView):
methods = ["GET", "POST"] # 与 FBV 中的 methods 属性相同, 控制请求方式
decorators = [wappers] # 添加装饰器
def get(self):
return render_template("login.html")
def post(self):
return "已收到'POST'请求"
app.add_url_rule("/login", endpoint=None, view_func=Login.as_view(name="login"))
if __name__ == '__main__':
app.run('0.0.0.0', 9999)