flask的路由配置,特殊装饰器

本文深入讲解Flask框架的使用,包括路由配置、实例化配置、视图函数、蓝图注册及特殊装饰器应用,同时提供了基于蓝图的数据操作和用户验证的具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,flask中的路由

  • endpoint-url_for反向地址
  • endpoint默认是视图函数名endpoint="雪雪"
  • methods 指定视图函数的请求方式,默认GET
  • default={"nid":1}指定视图函数的默认值
  • strict_slashes = False 是否严格遵循路由规则/login/
  • redirect_to"/xueren/" 永久跳转地址301
  • 动态路由参数
  • /<int:nid> / <string:str> / <nid>
  • 视图函数中需要有参数接收动态参数

2,Flask中的实例化配置

  • template_folder = "temp"  # template模板目录,默认当前项目中的template目录
  • static_folder = "xuexue"目录
  • static_url_path= "/static"   # 访问路径

 

  • host_matching = False  # 如果不是特别需要,慎用,否则所欲的route都需要host=""参数
  • subdomain_matching = False  # 理论上来说是用来限制SERVER_NAME子域名,
  • instance_path = None.  # 指向另一个Flask实例的路径
  • instance_relative_config = Flase  # 是否加载另一个实例的配置
  • root_path = None  # 主模块所在的目录绝对路径,默认项目目录

3,app对象配置

  • app.config.from_object(Debug)
  • class Debug(object):
    • DEBUG = true

4,Blueprint

  • from flask import Blueprint
  • blue = Blueprint("blue_id", __name__,url_prefix="user"每次访问蓝图的路径前缀)
  • app.reguster_blueprint(blue)

5,特殊装饰器:

  • @app.template_global()
  • @app.template_filter()
  • @app.before_request      # 请求进入视图函数之前
  • @app.after_request
  • def af1(response)
    • return response        # 结束视图函数之后, 返回客户端之前
  • 正常:be1---be2---be3---af3---af2---af1
  • 异常:be1---af3---af2---af1
  • @app.errorhandler(404)重定义页面
  • def error404(args):
    • return args
  • 基于蓝图实现增删改查数据,基于Before_request session实现用户校验,可选errorhandler

具体代码如下:

蓝图代码:

from flask  import Flask, request, render_template, redirect, session
from serv import users
import weishenme
app = Flask(__name__, static_url_path="/static")

# 注册配置类
app.config.from_object(weishenme.Debug)

# 注册蓝图
app.register_blueprint(users.user_blue)


@app.route("/detail")
def detail():
    return render_template("detail.html")

@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == "GET":
        return render_template("login1.html")
    else:
        session["user"] = request.form.get("user")
        return redirect("/")

@app.route("/")
def xiaocai():
    return "骚帆是一根小菜"



if __name__ == '__main__':
    app.run(debug=True)

配置类:

class Debug(object):
    DEBUG=True
    SECRET_KEY="xuexue"
    SESSION_COOKIE_NAME="xiaoxue"


class Testing(object):
    TESTING=True
    SECRET_KEY="xiaopangpang"
    SESSION_COOKIE_NAME="xueer"


class Production(object):
    SECRET_KEY="xueren"
    SESSION_COOKIE_NAME="csrf_token"

app的代码:

from flask import Flask, session, redirect, url_for, render_template, request
import weishenme
# 实例化一个Flask对象app
app = Flask(__name__)  # __name__表示是当前目录
# 指定session的key是xuexue
app.secret_key = "xuexue"

# 注册配置类
# app.config.from_object(weishenme.Debug)
app.config.from_object(weishenme.Testing)

# 装饰器
def outer(func):
    def hahaha(*args, **kwargs):
        if session["user"]:
            print(session["user"])
            ret = func(*args, **kwargs)
            return ret
        else:
            return redirect("/login")
    return hahaha


@app.route("/<nid>", endpoint="wc", methods=["GET", "POST"])
@outer
def wc(nid):
    print(nid)
    return render_template("xuexue.html")


@app.route("/detail", endpoint="detail")
@outer
def detail():
    print("detail")
    return render_template("detail.html")


@app.route("/login", methods=["GET", "POST"], strict_slashes=False)
def login():
    if request.method == "GET":
        return render_template("login1.html")
    else:
        session["user"] = request.form.to_dict().get("user")
        return redirect("/miss")


if __name__ == '__main__':

    # 运行这个flask项目
    app.run(host="0.0.0.0", port=2018)

请求执行流程代码:

from flask import Flask, request, session, render_template, redirect, session
import weishenme
from serv import users

app = Flask(__name__, static_folder="static_list",  static_url_path="/static")
# 到瑞配置类
app.config.from_object(weishenme.Debug)
# 注册蓝图
app.register_blueprint(users.user_blue)

@app.before_request
def is_login():
    print("b1")
    if request.path == "/login" :
        return None
    elif session.get("user"):
        return None
    else:
        return redirect("/login")

@app.before_request
def b2():
    print("b2")
    return None

@app.before_request
def b3():
    print("b3")
    return None


@app.after_request
def af1(res):
    print("af1")
    return res

@app.after_request
def af2(res):
    print("af2")
    return res

@app.after_request
def af3(res):
    print("af3")
    return res


@app.route("/", endpoint="index",methods=["POST", "GET"])
def index():
    return render_template("index1.html")

@app.route("/detail", endpoint="detail")
def detail():
    return render_template("detail.html")

@app.route("/login", methods=["GET", "POST"], strict_slashes=False)
def login():
    if request.method == "GET":
        return render_template("login1.html")
    else:
        print("xiaoxue")
        session["user"] = request.form.get("user")
        return redirect("/")

@app.errorhandler(404)
def error(args):
    print(args)
    return "您访问的页面不存在,或者走丢了.....%s" % args


if __name__ == '__main__':
    app.run(debug=True)

 

  

转载于:https://www.cnblogs.com/ljc-0923/p/10265389.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值