Flask 学习(三)路由介绍

Flask路由规则都是基于Werkzeug的路由模块的,它还提供了很多强大的功能。

两种添加路由的方式

方式一:
  @app.route('/xxxx')  # @decorator
  def index():
     return "Index"
方式二:
  def index():
     return "Index"
  app.add_url_rule('/xxx', "n1", index)  #n1是别名 

@app.route和app.add_url_rule参数

@app.route和app.add_url_rule参数:
            rule,                       URL规则
            view_func,                  视图函数名称
            defaults=None,              默认值,当URL中无参数,函数需要参数时,使用defaults={'k':'v'}为函数提供参数
            endpoint=None,              名称,用于反向生成URL,即: url_for('名称')
            methods=None,               允许的请求方式,如:["GET","POST"]
            

            strict_slashes=None,        对URL最后的 / 符号是否严格要求,
                                        如:
                                            @app.route('/index',strict_slashes=False),
                                                访问 http://www.xx.com/index/ 或 http://www.xx.com/index均可
                                            @app.route('/index',strict_slashes=True)
                                                仅访问 http://www.xx.com/index 
            redirect_to=None,           重定向到指定地址
                                        如:
                                            @app.route('/index/<int:nid>', redirect_to='/home/<nid>')
                                            或
                                            def func(adapter, nid):
                                                return "/home/888"
                                            @app.route('/index/<int:nid>', redirect_to=func)

举例使用

# ============对url最后的/符号是否严格要求=========
@app.route('/test',strict_slashes=True)  #当为True时,url后面必须不加斜杠
def test():
    return "aaa"
@app.route('/test',strict_slashes=False)  #当为False时,url上加不加斜杠都行
def test():
    return "aaa"

@app.route("/json_test/<int:age>" ,defaults={'age':66})
def json_test(age):
    ret_dic = {'name': 'xiaowang', 'age': age}
    return jsonify(ret_dic) # 转换json形式

 

带参数的路由

@app.route('/hello/<name>')
def hello(name):
    return 'Hello %s' % name

@app.route('/hello/<name>_<age>_<sex>')  # 多个参数
def hello(name,age,sex):
    return 'Hello %s,%s,%s' %(name,age,sex)

在浏览器的地址栏中输入http://localhost:5000/hello/Joh,你将在页面上看到”Hello Joh”的字样。

URL路径中/hello/后面的参数被作为hello()函数的name参数传了进来。

 

多个参数

# 动态路由参数
@app.route("/json_param/<int:age>" ,strict_slashes=False)
def json_param(age):
    ret_dic = {'name': 'xiaowang', 'age': age}
    return jsonify(ret_dic)

 

 

 

 endpoint

当请求传来一个url的时候,会先通过rule找到endpoint(url_map),然后再根据endpoint再找到对应的view_func(view_functions)。通常,endpoint的名字都和视图函数名一样。
实际上这个endpoint就是一个Identifier,每个视图函数都有一个endpoint,
当有请求来到的时候,用它来知道到底使用哪一个视图函数
endpoint可以解决视图函数重名的情况

Flask中装饰器多次使用
# 验证用户装饰器
def wrapper(func):
    @wraps(func)
    def inner(*args, **kwargs):
        if not session.get("user_info"):
            return redirect("/login")
        ret = func(*args, **kwargs)
        return ret
    return inner

@app.route("/login", methods=("GET", "POST"))
def login():
    # 模板渲染
    # print(request.path)
    # print(request.url)
    # print(request.headers)
    if request.method == "GET":
        print(request.args.get("id"))
        text_tag = "<p>你看见了吗test:<input type='text' name='test'></p>"
        text_tag = Markup(text_tag)
        return render_template("login.html", msg=text_tag)  # sum = add_sum)
    else:

        # print(request.form)
        # print(request.values.to_dict())   # 这个里面什么都有,相当于body
        # print(request.json)  # application/json
        # print(request.data)
        username = request.form.get("username")
        password = request.form.get("password")
        if username == "alex" and password == "123":
            session["user_info"] = username
            # session.pop("user_info")  #删除session
            return "登录成功"
        else:
            return render_template("login.html", msg="用户名或者密码错误")


# endpoint可以解决视图函数重名的情况
@app.route("/detail", endpoint="detail")
@wrapper  # f = route(wrapper(detail))
def detail():
    print(url_for("detail"))
    return render_template("detail.html", **STUDENT)


@app.route("/detail_list", endpoint="detail_list")
@wrapper  # f = route(wrapper(detail_list))
def detail_list():
    return render_template("detail_list.html", stu_list=STUDENT_LIST)


@app.route("/detail_dict")
def detail_dict():
    if not session.get("user_info"):
        return redirect("/login")
    return render_template("detail_dict.html", stu_dict=STUDENT_DICT)

反向生成URL: url_for

endpoint("name")   #别名

@app.route('/index',endpoint="xxx")  #endpoint是别名
def index():
    v = url_for("xxx")
    print(v)
    return "index"

静态文件位置

一个Web应用的静态文件包括了JS, CSS, 图片等,Flask的风格是将所有静态文件放在”static”子目录下。并且在代码或模板中,使用url_for('static')来获取静态文件目录

app = Flask(__name__,template_folder='templates',static_url_path='/xxxxxx')

<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
<div class="page">
    {% block body %}
    {% endblock %}
</div>

 

两个常用函数

@app.route("/bo")
def bo():
    # return render_template("bo.html")
    return send_file("s1.py") # 发送文件(可以是图像或声音文件)


@app.route("/json_test/<int:age>" ,defaults={'age':66})
def json_test(age):
    ret_dic = {'name': 'xiaowang', 'age': age}
    return jsonify(ret_dic) # 转换json形式,帮助转换为json字符串, 并且设置响应头Content-Type: application/json

 

  

 

posted @ 2019-09-27 17:00  一只小小的寄居蟹  阅读(484)  评论(0)    收藏  举报