flask之二 模板相关

flask之二 模板相关

预热

  • 在渲染模板的时候,默认会从项目根路径下的templates目录下查找模板
  • 如果想要指定模板路径的时候,就在初始化APP的时候,这样操作即可:
    app = Flask(__name__,template_folder=‘C:/templates‘) #template_folder可以指定模板位置

    模板传参

  • 在使用render_template渲染模板的时候,可以传递关键字参数,以后直接在模板中使用就可以了
  • 如果参数过多的话,那么就可以将所有的参数放到一个字典中,然后再传这个参数的时候使用**将字典打散成关键字参数。

    小例子:

  • my_template.py
    from flask import Flask,render_template
    app = Flask(__name__)
    app.debug = True
    @app.route(‘/‘)
    def hello_world():
    context = {
        ‘username‘: ‘wanghui‘,
        ‘age‘:19,
        ‘children‘:{
            ‘user‘:‘ccc‘,
            ‘type‘:‘stu‘,
        }
    }
    return render_template(‘index.html‘, **context)
    # return render_template(‘index.html‘,context=context)
    # return render_template(‘index.html‘,username=‘wanghui‘,age=19)
    if __name__ == ‘__main__‘:
    app.run()
  • templates/index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>my blog</title>
    </head>
    <body>
    <h1>这是模板渲染的数据</h1>
    {#<p>{{ username }}</p>#}
    {#<p>{{ age }}</p>#}
    {{ context.username }}
    {{ context.age }}
    <p>{{ username }}</p>
    <p>{{ children.user }}</p>
    </body>
    </html>

    模板中的url_for

    模板中的url_for和视图函数中的url_for是类似的,也是传递视图函数的名字,也可以传递参数。使用的时候,需要在url_for两边加上一个{{ url_for(‘func_name‘),ref=‘/‘,id=‘1‘}}

  • templates.py
    from flask import Flask,render_template,url_for
    app = Flask(__name__)
    app.debug = True
    @app.route(‘/‘)
    def hello_world():
    return render_template(‘index.html‘)
    @app.route(‘/accounts/login/<id>/‘)
    def login(id):
    return render_template(‘login.html‘)
    if __name__ == ‘__main__‘:
    app.run(port=8888)
  • templates/index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>my blog</title>
    </head>
    <body>
    <h1>这是从模板中渲染的</h1>
    <p><a href="{{ url_for(‘login‘,ref=‘/‘,id=‘1‘) }}">登陆</a></p>
    </body>
    </html>
  • templates/login.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Login page</title>
    </head>
    <body>
    <h1>这是登录页面</h1>
    {#{{ 用来存放变量 }}#}
    {#{% 用来执行函数或者逻辑代码 %}#}
    </body>
    </html>

    过滤器

    有时候我们需要在模板中对一些变量进行处理,那么就必须要类似于python中的函数一样,可以将这个值传到函数中,然后做一些操作。在模板中过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器会根据自己的功能,再返回相应的值,之后再将结果渲染到页面上。

  • 基本语法:{{ variable |过滤器的名字 }}
    guo
  • abs(value):返回一个数值的绝对值。 例如:-1|abs。
  • default(value,default_value,boolean=false):如果当前变量没有值,则会使用参数中的值来代替。name|default(‘xiaotuo‘)——如果name不存在,则会使用xiaotuo来替代。boolean=False默认是在只有这个变量为undefined的时候才会使用default中的值,如果想使用python的形式判断是否为false,则可以传递boolean=true。也可以使用or来替换。
  • escape(value)或e:转义字符,会将<、>等符号转义成HTML中的符号。例如:content|escape或content|e。
  • first(value):返回一个序列的第一个元素。names|first。
  • format(value,*arags,**kwargs):格式化字符串。例如以下代码:
    {{ "%s" - "%s"|format(‘Hello?‘,"Foo!") }}将输出:Helloo? - Foo!
  • last(value):返回一个序列的最后一个元素。示例:names|last。
  • length(value):返回一个序列或者字典的长度。示例:names|length。
  • join(value,d=u‘‘):将一个序列用d这个参数的值拼接成字符串。
  • safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。示例:
    content_html|safe。
    int(value):将值转换为int类型。
    float(value):将值转换为float类型。
    lower(value):将字符串转换为小写。
    upper(value):将字符串转换为小写。
    replace(value,old,new): 替换将old替换为new的字符串。
    truncate(value,length=255,killwords=False):截取length长度的字符串。
    striptags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。
    trim:截取字符串前面和后面的空白字符。
    string(value):将变量转换成字符串。
    wordcount(s):计算一个长字符串中单词的个数。
  • default过滤器详解:
    如果某个变量使用方式是{{ value|default(‘默认值‘)}},如果value这个key不存在的话就使用过滤器提供的默认值;如果类似于python中判断一个值是否为False(例如:空字典,空字符串,空列表的话)那么久必须要传递另外一个参数{{ value | default(‘默认值‘,boolean=True)}};
    可以使用or来替换default(‘默认值‘,boolean=True)(例如{{ siginature or ‘此人很懒没有留下任何说明‘}})
    例子:
  • defaulte_falter.py
    from flask import Flask,render_template
    app = Flask(__name__)
    @app.route(‘/‘)
    def index():
    context = {
        ‘position‘:-9,
        ‘signature‘:‘‘,
        #‘signature‘:‘this ismy blog‘
    }
    return render_template(‘index.html‘,**context)
    if __name__ == ‘__main__‘:
    app.run(debug=True)
  • templates/index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>MyBlog</title>
    </head>
    <body>
    {#<p>个性签名:{{ signature|default(‘此人很懒没有留下任何说明!‘,boolean=True) }}</p>#}
    <p>个性签名:{{ signature or ‘此人很懒没有留下任何说明!‘}}</p>
    </body>
    </html>
  • esacape:转义过滤器
    • safe过滤器:可以关闭一公分字符串的自动转义
    • escape过滤器:对某个字符串进行转义
    • autoescape过滤器:可以对其代码框内的代码块关闭自动转义
    • first:返回序列中的第一个元素
  • last:返回序列中的最后一个元素
  • format:格式化输出
  • length:长度计算
  • int:转换成整数
  • replase:旧字符串换成新的
  • truncate:指定长度截取(结合striptags去除掉html字段之后截取纯净字符串然后按字数去做预览页填充)
  • striptags:去除标签中的html字段
  • worldcount(s):统计一个长字符串中的单词数
    小例子:
  • escape.py
    from flask import Flask,render_template
    app = Flask(__name__)
    @app.route(‘/‘)
    def hello_world():
    context = {
        ‘position‘:-9,
        ‘signature‘:‘<script>alert("Hello world!")</script>‘,
        ‘persons‘:[‘abc‘,‘def‘],
        ‘age‘:"18",
        ‘article‘:‘hello hello xxooo xxooo!!‘
    }
    return render_template(‘index.html‘,**context)
    if __name__ == ‘__main__‘:
    app.run(debug=True,port=8080)
  • templates/index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>MyBlog</title>
    </head>
    <body>
    {#{% autoescape off %}#}
    {#<p>个性签名:{{ signature }}</p>#}
    {#{% endautoescape %}#}
    <p>{{ signature|safe }}</p>
    <p>{{ persons|first }}</p>
    <p>{{ persons[0] }}</p>
    <p>{{ persons|last }}</p>
    <p>{{ persons[-1] }}</p>
    <p>{{ "我的名字是%s"|format("hello word!") }}</p>
    <p>{{ "人数是 %d"|format(persons|length) }}</p>
    {% if age|int == 18 %}
    <p>年龄是18岁</p>
    {% else %}
    <p>年龄不是18岁</p>
    {% endif %}
    <p>{{ article|replace(‘hello‘,‘sssssz‘) }}</p>
    <p>{{ article|truncate(length=5) }}</p>
    <p>{{ signature|striptags }}</p>
    </body>
    </html>

    自定义模板过滤器

    1. 在python文件中写好自己的过滤器(本质上就是一个函数)
    2. 如果要在模板中调用这个过滤器,那就需要在这个函数上加一个装饰器@app.template_filter(‘过滤器名称‘)
    3. 自动加载的话就在app下添加
      app.config[‘TEMPLATES_AUTO_RELOAD‘] = True
  • 小例子:
  • define_filter.py
    **from flask import Flask,render_template
    app = Flask(__name__)
    app.config[‘TEMPLATES_AUTO_RELOAD‘] = True
    @app.route(‘/‘)
    def hello_world():
    context={
        ‘article‘:‘anyway hello anyway hello abccc‘
    }
    return render_template(‘index.html‘,**context)
    @app.template_filter(‘cut‘)
    def cut(value):
    vaule = value.replace("hello","sbsb")
    return value
    if __name__ == ‘__main__‘:
    app.run(debug=True,port=9090)**
  • templates/index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>myblog</title>
    </head>
    <body>
    <p>{{ article|cut }}</p>
    </body>
    </html>

    实战自定义过滤器

  • 时间处理(从现在到发帖的时间差)
  • shizhan.py
    from flask import Flask,render_template
    from datetime import datetime
    app = Flask(__name__)
    app.config[‘TEMPLATES_AUTO_RELOAD‘] = True
    @app.route(‘/‘)
    def index():
    context={
        ‘article‘:‘aaa bbb ccc‘,
        ‘create_time‘:datetime(2018,02,23,10,12,11)
    }
    return render_template(‘index.html‘,**context)
    @app.template_filter(‘handle_time‘)
    def handle_time(time):
    ‘‘‘
    1.距离现在的时间多久,如果间隔在一分钟以内就表示刚刚
    2.在一小时以内就显示xx分钟前
    3.在24小时以内就显示xx小时前
    4. 在一个月之内就显示多少天之前
    5. 否则就显示具体的时间
    :param time:
    :return:
    ‘‘‘
    if isinstance(time,datetime):
        now = datetime.now()
        timestamp = (now - time).total_seconds() #获取间隔秒数
        if timestamp < 60:
            return "刚刚"
        elif timestamp >=60 and timestamp<= 60*60:
            minutes = timestamp/60
            return "%s分钟前",int(minutes)
        elif timestamp >= 60*60 and timestamp <= 60*60*24:
            hours = timestamp/(60*60)
            return "%s小时前",int(hours)
        elif timestamp >= 60*60*24 and timestamp<= 60*60*24*30:
            days = timestamp/(60*60*24)
            return "%s天前",int(days)
    else:
        return time.strftime(‘%Y-%m-%d %H:%M‘)
    if __name__ == ‘__main__‘:
    app.run(port=9092,debug=True)
  • templates/index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>MyBlog</title>
    </head>
    <body>
    <p>发表时间:{{ create_time|handle_time }}</p>
    </body>
    </html>

原文地址:http://blog.51cto.com/11696827/2089291

时间: 2024-07-31 06:48:59

flask之二 模板相关的相关文章

Flask基础(二)---模板渲染中的过滤器定义

Flask中模板渲染中过滤器的定义: from flask import Flask,render_template app = Flask(__name__) @app.route("/") def index(): return render_template("temp-demo2.html") # 方式一 # 自定义过滤器函数,命名不能与内置过滤器重名,不然会覆盖 # 自定义列表切片过滤器 def li_setup2(li): # 按照步长为2进行模板切片

Flask备注二(Configurations, Signals)

Flask备注二(Configuration, Signals) Flask是一个使用python开发Web程序的框架.依赖于Werkzeug提供完整的WSGI支持,以及Jinja2提供templates支持.Flask的设计理念是提供Micro以及方便的框架."Micro"是因为除了提供基本特性功能的实现外,其他的功能(例如数据库访问)都是通过extension来完成.方便的特点是因为提供了简单易用的必要特性和功能,提供的功能包含: 内置的开发服务器和调试工具. 集成单元测试支持.

python 外键用法 多对多关系 ORM操作 模板相关

一.app/models中写类(设计表结构) 1.普通类 class  A(models.Model): id=modles.AutoField(primary_key=True) name=models.CharField(max_length=32,unique=True) 2.设置外键 class B(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=32,

Jsoup代码解读之二-DOM相关对象

Jsoup代码解读之二-DOM相关对象 之前在文章中说到,Jsoup使用了一套自己的DOM对象体系,和Java XML API互不兼容.这样做的好处是从XML的API里解脱出来,使得代码精炼了很多.这篇文章会说明Jsoup的DOM结构,DOM的遍历方式.在下一篇文章,我会并结合这两个基础,分析一下Jsoup的HTML输出功能. DOM结构相关类 我们先来看看nodes包的类图: 这里可以看到,核心无疑是Node类. Node类是一个抽象类,它代表DOM树中的一个节点,它包含: 父节点parent

flask中jinjia2模板引擎使用详解4

接上文 For循环 和其它编程语言一样,for用来编辑列表中的项.下面以一个例子来说明for在flask的jinjia2模板中的使用. 创建一个模板list.html 代码如下: {% %} {% %}      {% %}      <>{{ }}</>      {% %} {% %} 在code.py中添加url规则 @app.route() renderList():      users = [,,]      render_template(,users = users

flask中jinjia2模板引擎详解4

接上文 For循环 和其它编程语言一样,for用来编辑列表中的项.下面以一个例子来说明for在flask的jinjia2模板中的使用. 创建一个模板list.html 代码如下{% extends "base.html" %} {% block content %}     {% for user in users %}     <li>{{ user }}</li>     {% endfor %} {% endblock %} 在code.py中添加url规

Flask 的 template模板 与 jinja2语法

Flask 的 template模板 与 jinja2语法 Flask使用的是Jinja2模板,所以其语法和Django基本无差别 1.模板基本数据的渲染 变量 {{..}} 列表 {% for item in List %}<li>{{item}}</li>{% endfor %} 字典 {% for k,v in Dict.items() %}<li>{{k}}{{v}}</li>{% endfor %} 2 注意:Markup等价django的mark

Flask学习之二 模板

继续学习flask 本部分mega教程的翻译地址:http://www.pythondoc.com/flask-mega-tutorial/templates.html 一.为什么使用模板? 以下做一个小小的扩展:输出一个大标题. 一个容易的选择就是改变我们的视图功能,输出 HTML. 修改app/views.py 1 from app import app 2 3 @app.route('/') 4 @app.route('/index') 5 def index(): 6 user = {

Flask学习之二——模板

1.Jinja2模板引擎 模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道.使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染. 默认情况下,Flask 在程序文件夹中的 templates 子文件夹中寻找模板.Flask 提供的 render_template 函数把 Jinja2 模板引擎集成到了程序中.render_template 函数的第一个参数是模板的文件名.随后的参数都是键值对,表示模板中变量对应的真实值. -*- u