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

原文地址:https://www.cnblogs.com/songhaixing/p/14851622.html