• 🍖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>
    

  • 相关阅读:
    codeforces431C
    codeforces158C
    codeforces570C
    codeforces472C
    codeforces401C
    codeforces630C
    codeforces581C
    校内题目腐草为萤
    校内题目大美江湖
    洛谷P3370 && 字符串哈希讲解
  • 原文地址:https://www.cnblogs.com/songhaixing/p/14851622.html
Copyright © 2020-2023  润新知