flask的自定义转换器,模板渲染以及请求与响应

flask的自定义转换器

1.导入from werkzeug.routing import BaseConverter
2.写个类继承BaseConverter,实现三个方法:def __init__,def to_python, def to_url
3.将上面的类注册到app.url_map.converters['regex'] = RegexConverter中
4.在路由转换器中使用3中的regex("传正则")
5.当路由被访问后,regex("传正则")会匹配结果,把结果传递给to_python,可以进行再次处理,to_python处理好的结果,会传递给响应函数的形参
6 当用url做反向解析的时候,传递给路由转化器的参数,会经过to_url,进行处理,处理以后,再拼接到路由

代码:

from flask import Flask, url_for
from werkzeug.routing import BaseConverter

app = Flask(import_name=__name__)

class RegexConverter(BaseConverter):
    """
    自定义URL匹配正则表达式
    """
    def __init__(self, map, regex):
        super(RegexConverter, self).__init__(map)
        self.regex = regex

    def to_python(self, value):
        """
        路由匹配时,匹配成功后传递给视图函数中参数的值
        """
        print("to_python",value,type(value))
        return int(value)+1

    def to_url(self, value):
        """
        使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
        """
        val = super(RegexConverter, self).to_url(value)
        return val+"222"

# 添加到flask中
app.url_map.converters['regex'] = RegexConverter
# 正则匹配处理结果,要交给to_python,to_python函数可以对匹配处理结果做处理
@app.route('/index/<regex("\d+"):nid>')
def index(nid):
    print("index",nid,type(nid))
    print(url_for('index', nid='888'))
    return 'Index'

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

flask的模板渲染

from flask import Flask, render_template, Markup

app = Flask(__name__)
app.debug = True

USERS = {
    1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
    2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
    3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}


def func1(arg):
    return Markup(f"<h1>god is handsome, {arg} am sb</h1>")


@app.route("/")
def index():
    return render_template("index.html", user=USERS, name='godsee', ht1=func1, ht="god is handsome")
    # 或者
    # data = {
    #     "user": USERS,
    #     "name": "godsee"
    # }
    # return render_template("index.html", **data)


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

index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>我是html文件</h1>
<br>
<table>
    {% for k,v in user.items() %}
        <tr>
            <td>{{ k }}</td>
            <td>{{ v.name }}</td>
            <td>{{ v['age'] }}</td>
            <td>{{ v.get('text') }}</td>
            <td>{{ url_for('index') }}</td>
        </tr>
    {% endfor %}

</table>
<br>

<div>{{name}}</div>
<br>

{% if name == 'tank' %}
    <h1> is sb</h1>
{% else %}
    <h1> is dsb</h1>
{% endif %}
<br>

{{ ht|safe }}
<br>

{{ht1('I')}}
<br>
</body>
</html>

图展:

flask的请求与响应

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

app = Flask(__name__)

@app.route("/",methods=["POST","GET"])
def index():
    # 请求相关的信息
    # print("请求方法",request.method)#请求方法
    # print("get请求的参数",request.args)# get请求的参数
    # print("post请求的参数",request.form) #post请求的参数
    # print("post,与get的所有参数",request.values)#post,与get的所有参数
    # print("请求的cookies",request.cookies)#请求的cookies
    # 请求相关信息
    # request.method  提交的方法
    # request.args  get请求提及的数据
    # request.form   post请求提交的数据
    # request.values  post和get提交的数据总和
    # request.cookies  客户端所带的cookie
    # request.headers  请求头
    # request.path     不带域名,请求路径
    # request.full_path  不带域名,带参数的请求路径
    # request.script_root
    # request.url           带域名带参数的请求路径
    # request.base_url      带域名请求路径
    # request.url_root      域名
    # request.host_url      域名
    # request.host          127.0.0.1:500

    #关于响应我们已经将了4剑客,如果添加响应头,以及cookie
    #要添加这些东西必须,导入make_response,

    response = make_response("ok")
    #response = make_response(render_template("login.html"))
    #response = make_response(redirect("/login"))
    #设置cookie
    #response.set_cookie("key","val")
    #如何删除cookie
    #response.delete_cookie("key")
    # 如何设置响应头
    response.headers["x-somexx"] = "A SB"
    return  response

图片展示:

posted @ 2020-03-19 16:34  godlover  阅读(257)  评论(0编辑  收藏  举报