欢迎来到夜的世界

莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生.料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去,也无风雨也无晴。
扩大
缩小

路由系统

    一 . 装饰器的坑及解决方法      

1. 使用装饰器装饰两个视图函数,代码如下 : 

  from flask import Flask, redirect, render_template, request, session

  app = Flask(__name__)

  app.secret_key = "wanglili"

  # 装饰器函数
  def outer(func):
    def inner(*args, **kwargs):
      if session.get("user"):   # 验证session
        ret = func(*args, **kwargs)
        return ret
      else:
        return redirect("/login")
    return inner

  @app.route("/")
  @outer      # inner=outer(index)
  def index():
    return render_template("index.html")

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

  @app.route("/login", methods=["POST", "GET"])
  def login():
    if request.method == "GET":
      return render_template("login.html")

    if request.form.get("username") == "wll"and request.form.get("password") == "123":
      session["user"] = request.form.get("username")  # 写入session
      return redirect("/")

    return render_template("login.html")

  app.run(debug=True)

  启动程序后有如下错误 : 

  我们还发现当装饰一个视图函数时可以正常运行,而装饰两个或两个以上的视图函数则会报以上错误.

 2 . 解决方法 

  1) . 方式一 : 使用functools模块 

 import functools

  def outer(func):
    @functools.wraps(func)           # 保留原函数func的信息
    def inner(*args, **kwargs):
      if session.get("user"):   
        ret = func(*args, **kwargs)
        return ret
      else:
        return redirect("/login")
      return inner

 

  2) . 方式二 : 使用flask提供的endpoint参数

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

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

 

    二 . Flask中的装饰器        

  1. @app.route()装饰器中的参数      

      methods : 当前 url 地址,允许访问的请求方式    

@app.route("/info", methods=["GET", "POST"])
def student_info():
    stu_id = int(request.args["id"])
    return f"Hello Old boy {stu_id}"  # Python3.6的新特性 f"{变量名}"

    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
    stu_id = int(request.args["id"])
    return f"Hello Old boy {stu_id}"  # Python3.6的新特性 f"{变量名}"

    defaults : 视图函数的参数默认值{"nid":1}     

from flask import url_for


@app.route("/info", methods=["GET", "POST"], endpoint="r_info", defaults={"nid": 100})
def student_info(nid):
    print(url_for("r_info"))  # /info
    # stu_id = int(request.args["id"])
    print(nid)  # 100
    return f"Hello Old boy {nid}"  # Python3.6的新特性 f"{变量名}"

    strict_slashes   :  

  url 地址结尾符 "/" 的控制.

  False : 无论结尾 "/" 是否存在均可以访问.

  True : 结尾必须不能是 "/"

# 访问地址 : /info 
@app.route("/info", strict_slashes=True)
def student_info():
    return "Hello Old boy info"


# 访问地址 : /infos  or  /infos/
@app.route("/infos", strict_slashes=False)
def student_infos():
    return "Hello Old boy infos"

    redirect_to : url地址重定向    

# 访问地址 : /info 浏览器跳转至 /infos
@app.route("/info", strict_slashes=True, redirect_to="/infos")
def student_info():
    return "Hello Old boy info"

@app.route("/infos", strict_slashes=False)
def student_infos():
    return "Hello Old boy infos"

     subdomain     

  子域名前缀 subdomian="DragonFire" 这样写可以得到 DragonFire.oldboyedu.com 前提是app.config["SERVER_NAME"] = "oldboyedu.com"

app.config["SERVER_NAME"] = "oldboy.com"

@app.route("/info",subdomain="DragonFire")
def student_info():
    return "Hello Old boy info"

# 访问地址为:  DragonFire.oldboy.com/info

  2. 动态路由参数  :  

from flask import url_for


# 访问地址 : http://127.0.0.1:5000/info/1
@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"{变量名}"

<int:nid> 就是在url后定义一个参数接收

但是这种动态参数路由,在url_for的时候,一定要将动态参数名+参数值添加进去,否则会抛出参数错误的异常

       总结       

1.endpoint  #反向生成url地址标志 默认视图函数名 url_for
2.methods  #视图函数允许的请求方式
6."/index/<page>" 动态路由路由参数
    def index(page)
    
3.defaults={"nid":"123456"} # 默认参数
4.strict_slashes=True  #是否严格遵循路由地址
5.redirect_to="/login"  #永久重定向 301

 

posted on 2019-01-09 17:09  二十四桥_明月夜  阅读(159)  评论(0编辑  收藏  举报

导航