zoukankan      html  css  js  c++  java
  • 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
    

    图片展示:

  • 相关阅读:
    C语言实现字母接龙的小程序
    求教有关C++中子对象析构的问题
    Leaflet中使用leafletsidebar插件实现侧边栏效果
    Leaflet中使用LeafletMiniMap插件实现小地图效果
    Leaflet中使用leafletsearch插件实现搜索定位效果
    Leaflet中使用awesomemarkers插件显示带图标的marker
    Leaflet中使用Leaflet.Spin插件实现地图加载等待效果
    Leaflet中使用Leaflet.Pin插件实现图层要素编辑效果
    Leaflet中使用Leaflet.contextmenu插件实现地图上添加鼠标右键菜单
    Leaflet中使用Leaflet.MagnifyingGlass实现放大镜效果
  • 原文地址:https://www.cnblogs.com/godlover/p/12525184.html
Copyright © 2011-2022 走看看