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)
posted @ 2019-07-08 15:18  言值  阅读(161)  评论(0编辑  收藏  举报