zoukankan      html  css  js  c++  java
  • 🍖CBV与Flask模板

    一.CBV

    from flask import Flask, jsonify, views
    
    app = Flask(__name__)
    app.debug = True
    
    def auth(func):
        def wrapper(*args, **kwargs):
            res = func(*args, **kwargs)
            print("auth")
            return res
    
        return wrapper
    
    def login(func):
        def wrapper(*args, **kwargs):
            res = func(*args, **kwargs)
            print("login")
            return res
    
        return wrapper
    
    # 继承MethodView
    class IndexView(views.MethodView):
        methods = ['GET', "POST"]  # 限制请求方式
        decorators = [auth, login]  # 添加装饰器,执行顺序自上而下
    
        def get(self, k1):
            print(k1)
            return 'GET 请求!'
        
        def post(self):
            return 'POST 请求!'
    
    # CBV路由注册,as_view( )中必须传 name, name是该路由用于反向解析时的别名
    app.add_url_rule('/', view_func=IndexView.as_view(name='index'),
                     defaults={'k1': 'hello word!'},strict_slashes=False)
    
    if __name__ == '__main__':
        app.run()
    

    二.模板

    flask 使用的是 jinja2 的模板语法, 想比较 Django的 DTL 更强大,它支持加括号执行,支持传值, 字典支持中括号取值和get取值

    1.变量渲染 : {{ }}

    2.循环变量 : {% for i in items %}

    <body>
        <h1>用户列表</h1>
        <table>
            {% for k,v in user_dict.items() %}
            <tr>
                <td>{{k}}</td>
                <td>{{v.name}}</td>
                <td>{{v['name']}}</td>
                <td>{{v.get('name')}}</td>
                <td><a href="/detail/{{k}}">查看详细</a></td>
            </tr>
            {% endfor %}
        </table>
    </body>
    

    3.逻辑判断 : {% if|else %}

    <body>
        <h1>用户列表</h1>
        <table>
            {% if name %}
              <h1>Hello {{ name }}!</h1>
            {% else %}
              <h1>Hello World!</h1>
            {% endif %}
        </table>
    </body>
    

    4.处理XSS攻击

    • 在Django中处理XSS攻击可以使用 make_safe 方法将其转意
    from django.utils.safestring import mark_safe
    html_safe = mark_safe('<h1>你好</h1>')
    
    • 在falsk中可以使用Markup()方式将其转意
    # 被弃用的方法(但还能使用)
    from flask import Flask,Markup
    Markup("<input type='text' value='%s' />" %(args,))
    # 但查看源码可以发现在jinja2-3.1版本已经将该中方法弃用了,使用了新的方法
    import markupsafe
    markupsafe.Markup("<input type='text' value='%s' />" %(args,))
    
    • 代码示例
    from flask import Flask,render_template,Markup,jsonify,make_response
    import markupsafe
    app = Flask(__name__)
    app.debug = True
    
    def func(args):
        # return Markup("<input type='text' value='%s' />" %(args,))
        return markupsafe.Markup("<input type='text' value='%s' />" %(args,))
    
    
    @app.route('/')
    def index():
        return render_template('index.html',func=func)
    
    if __name__ == '__main__':
        app.run()
    
    <!-- index.html -->
    <body>
    <h3>{{func(222)}}</h3>
    <h3>{{func(333)}}</h3>
    </body>
    
    • 效果

    image-20210603202823220

    • 为了防止XSS攻击, flask会将标签符号 "< >" 变成 "&gt;", "&lt;" 这种, 如果我们想将这种格式的字符串渲染到前端页面是个标签而不是字符串, 我们就可以使用 "Markup( )" 方法
    from flask import Flask,request,render_template,jsonify,make_response
    import markupsafe
    app = Flask(__name__)
    app.debug = True
    
    @app.route('/')
    def index():
        # string = "<input type='text' value='123'>"
        string = " &lt; input type='text' value='123' &gt;"
        test = markupsafe.Markup(string)
        return render_template('index.html',test=test)
    
    if __name__ == '__main__':
        app.run()
    
    <body>
    {{test}}
    </body>
    
    <!-- 或者后端不使用 "Markup"处理, 前端使用 "safe" 过滤器来实现(django中也是如此) -->
    <body>
    {{test|safe}}
    </body>
    

  • 相关阅读:
    js实现图片轮播(修改版1)
    动态添加内容到滚动区域
    新闻自动滚动
    多媒体对象(Media Object)
    (Py练习)判断能被几个9整除
    (Py练习)输出乘法口诀表
    (Py练习)输入某年某月判断天数
    文件名称批量修改
    续订Jetbrain学生包
    (Py练习)判断101-200之间的素数个数并输出
  • 原文地址:https://www.cnblogs.com/songhaixing/p/14851622.html
Copyright © 2011-2022 走看看