Jinja2模板语言

  1. # -*- coding: utf-8 -*-  
  2. from flask import Flask, render_template, request, redirect, Markup  
  3.   
     
  4. app = Flask(__name__)  
  5.   
     
  6. STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'}  
  7.   
     
  8. STUDENT_LIST = [  
  9.     {'name': 'Old', 'age': 38, 'gender': '中'},  
  10.     {'name': 'Boy', 'age': 73, 'gender': '男'},  
  11.     {'name': 'EDU', 'age': 84, 'gender': '女'}  
  12. ]  
  13.   
     
  14. STUDENT_DICT = {  
  15.     1: {'name': 'Old', 'age': 38, 'gender': '中'},  
  16.     2: {'name': 'Boy', 'age': 73, 'gender': '男'},  
  17.     3: {'name': 'EDU', 'age': 84, 'gender': '女'},  
  18. }  
  19.   
     
  20. # 返回标签  
  21. tag = '<input type="text", name="username">'  
  22. tag = Markup(tag)  # 安全标签字符串  
  23.   
     
  24.   
     
  25. # 传入函数, 全局可以使用  
  26. @app.template_global()  
  27. def func(a, b):  
  28.     return a + b  
  29.   
     
  30.   
     
  31. @app.template_filter()  
  32. def fil(a, b, c):  
  33.     return a + b + c  
  34.   
     
  35.   
     
  36. @app.route('/')  
  37. def index():  
  38.     return render_template('index.html', stu=STUDENT,  
  39.                            stu_list=STUDENT_LIST,  
  40.                            stu_dic=STUDENT_DICT,  
  41.                            tagtag=tag)  # 传递参数给前端  
  42.   
     
  43.   
     
  44. @app.route('/login', methods=['POST', 'GET'])  
  45. def login():  
  46.     if request.method == 'GET':  
  47.         return render_template('login.html')  
  48.   
     
  49.     if request.form.get('username') == 'root' or request.form.get('password') == 'root':  
  50.         return redirect('/')  
  51.   
     
  52.   
     
  53. app.run(host='0.0.0.0', debug=True)  

 

前端展示:

  1. <!DOCTYPE html>  
  2. <html lang="en">  
  3. <head>  
  4.     <meta charset="UTF-8">  
  5.     <title>首页</title>  
  6. </head>  
  7. <body>  
  8.   
     
  9. {{ tag }}                      {# 后端传入标签 #}  
  10. {{ func(1, 2) }}               {# 函数调用 #}  
  11. {{ func(1, 2) | fil(1, 2) }}   {# 将 | 前面当成第一个参数传入 #}  
  12.   
     
  13. {% macro create_drf(na, ty) %}  {# 声明函数 叫宏#}  
  14. {#    {{ na }}: {{ ty }} <input name="{{ na }}", type="{{ ty }}">#}  
  15.     {{ na + ty }}  
  16. {% endmacro %}  
  17.   
     
  18. {# 调用 macro #}  
  19. {#{{ create_drf('username', 'text') }}#}  
  20. {{ create_drf(1, 2) }}  
  21.   
     
  22.   
     
  23. <br>  
  24. 学生信息{{ stu }}  
  25. <table border="2px">  
  26.     <tr>  
  27.         <td>{{ stu.name }}</td>                 {# 三种取值的方式 #}  
  28.         <td>{{ stu.get('age' )}}</td>  
  29.         <td>{{ stu['gender'] }}</td>  
  30.     </tr>  
  31. </table>  
  32.   
     
  33. {{ stu_list }}  
  34. <table border="2px">  
  35.     {% for stu in stu_list %}                   {# 遍历列表 #}  
  36.         <tr>  
  37.             <td>{{ stu.name }}</td>  
  38.             <td>{{ stu.get('age')}}</td>  
  39.             <td>  
  40.                 {% if stu['gender'] == '中' %}  {# for循环 #}  
  41.                     男  
  42.                 {% else %}  
  43.                     {{ stu['gender'] }}  
  44.                 {% endif %}  
  45.             </td>  
  46.         </tr>  
  47.     {% endfor %}  
  48. </table>  
  49.   
     
  50. {{ stu_dic }}  
  51. <table border="2px">  
  52.     {% for id, info in stu_dic.items() %}         {# 遍历字典 keys. vals #}  
  53.         <tr>  
  54.             <td>{{ id }}</td>  
  55.             <td>{{ info.name }}</td>  
  56.             <td>{{ info.get('age') }}</td>  
  57.             <td>{{ info['gender'] }}</td>  
  58.   
     
  59.         </tr>  
  60.     {% endfor %}  
  61. </table>  
  62.   
     
  63. </body>  
  64. </html>  

 

Session

  1. # -*- coding: utf-8 -*-  
  2. from flask import Flask, session, render_template, request, redirect  
  3.   
     
  4. app = Flask(__name__)  
  5.   
     
  6. app.secret_key = 'ujyujyunyun#yurefrefr'  # 加密字符串  
  7.   
     
  8.   
     
  9. @app.route('/')  
  10. def index():  
  11.     if not session.get('user'):  
  12.         return redirect('/login')  
  13.     return render_template('index2.html')  
  14.   
     
  15.   
     
  16. @app.route('/login', methods=['POST', 'GET'])  
  17. def login():  
  18.     if request.method == 'GET':  
  19.         return render_template('login.html')  
  20.     if request.form.get('username') == 'root':  
  21.   
     
  22.         session['user'] = 'peach'  # 设置session,存放在了客户端(我们映像中session是存在服务端的)  
  23.         # 因为,flask 为了精简自己,不往自己和内存中添加,就是通过secret_key 加密放在客户端浏览器  
  24.         # 因此,引入的第三方组件 flask-session,相对安全解决了session存放在浏览器问题  
  25.   
     
  26.         return redirect('/')  
  27.   
     
  28.   
     
  29. app.run(host='0.0.0.0', debug=True)  

 

装饰器

通用装饰器

  1. # 装饰器  
  2. def waibu(func):  
  3.     def neibu(*args, **kwargs):  
  4.         ret = func(*args, **kwargs)  
  5.         return ret  
  6.     return neibu  
  7.   
     
  8.   
     
  9. def f(a, b):  
  10.     return a + b  
  11.   
     
  12. # print(waibu(f))  # <function waibu.<locals>.neibu at 0x7fb86dffe2f0>  得到一个内部函数neibu  
  13. ni = waibu(f)  
  14. pint(ni(1, 2))  

 

 

 

多个装饰器装饰的时候该如何添加

  1. # 添加装饰器  
  2. def wai(func):  
  3.     def neibu(*args, **kwargs):  
  4.         if session.get('user'):  
  5.             ret = func(*args, **kwargs)  
  6.             return ret  
  7.         else:  
  8.             redirect('/login')  
  9.     return neibu  
  10.   
     
  11.   
     
  12. @app.route('/')  
  13. @wai  
  14. def index():  
  15.     if not session.get('user'):  
  16.         return redirect('/login')  
  17.     return render_template('index2.html') 

 

  1. 我们应该是添加在靠近函数那里,如上图  
  2. 因为wai 等价于ni = neibu(index)  
  3. Neibu() 函数传入的是index, 先执行玩视图,在执行外面的路由  
  4.   
     

装饰器装饰多个函数的时候,出现太多  

因为装饰器装饰完后返回的都是ni,两个装饰的都是ni,所有出问题,这里跟函数名相同的情况下,报错的原因一摸一样  

 

  1. 因此我们有两种方案解决  
  2. 第一种:  
  3. 装饰器返回的是内存地址,<function waibu.<locals>.neibu at 0x7fb86dffe2f0>  得到一个内部函数neibu  
  4.   
     
  5. 我们保留内部原始数据,就引入了functools  

  1. 第二种:  
  2. 是flask内部的 endpoint 

  1. Endpoint的作用相当于url_for,反相获取到路由地址  / /index  
  2.   
     
  3. 这两种都可以解决 装饰器问题  

Flask 模板语言,装饰器的更多相关文章

  1. flask模板语言,装饰器,路由及配置

    1.模板语言jinja2 Flask中默认的模板语言是Jinja2 1.0 模板传参 from flask import Flask,render_template app = Flask(__nam ...

  2. Flask - 模板语言jinja2 和render_template高级用法

    目录 Flask - 模板语言jinja2 和render_template高级用法 一. 字典传递至前端 二. 列表传入前端Jinja2 模板的操作: 三. 大字典传入前端 Jinja2 模板 四. ...

  3. flask模板语言 jinja2 以及render_template 深度用法

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

  4. flask session,蓝图,装饰器,路由和对象配置

    1.Flask 中的路由   *endpoint - url_for 反向地址  *endpoint 默认是视图函数名  *methods 指定视图函数的请求方式,默认GET  defaults={& ...

  5. flask模板语言

    由于Django的模板引擎和Flask中的Jinja2模板引擎有很多一样的地方,所以我将一样的地方总结到了独立的文章中 https://www.cnblogs.com/kuxingseng95/art ...

  6. python flask route中装饰器的使用

    问题:route中的装饰器为什么感觉和平时使用的不太一样,装饰器带参数和不太参数有什么区别?被修饰的函数带参数和不带参数有什么区别? 测试1:装饰器不带参数,被修饰的函数也不带参数. def log( ...

  7. flask --- 03 .特殊装饰器, CBV , redis ,三方组件

    一.特殊装饰器(中间件) 1.before_request 在请求进入视图函数之前 @app.before_request def look(): 2. after_request 在结束视图函数之后 ...

  8. Flask系列06--(中间件)Flask的特殊装饰器 before_request,after_request, errorhandler

    一.使用 Flask中的特殊装饰器(中间件)方法常用的有三个 @app.before_request # 在请求进入视图函数之前 @app.after_request # 在请求结束视图函数之后 响应 ...

  9. flask(1.1)装饰器装饰多个视图函数出现的问题

    目录 1.装饰器装饰多个视图函数出现的问题 2.使用装饰器修复技术解决该问题 1.装饰器装饰多个视图函数出现的问题 代码实例: from flask import Flask, request, re ...

随机推荐

  1. 从入门到入土:Lambda完整学习指南,包教包会!

    什么是Lambda表达式 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口.lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使 ...

  2. JS的Form表单转JSON格式

    一.serialize()方法 格式:var data = $("#formID").serialize(); 功能:将表单内容序列化成一个字符串. 注意:要使用params = ...

  3. 阿里巴巴的 Kubernetes 应用管理实践经验与教训

    作者 | 孙健波(天元)  阿里巴巴技术专家 导读:本文整理自孙健波在 ArchSummit 大会 2019 北京站演讲稿记录.首先介绍了阿里巴巴基于 Kubernetes 项目进行大规模应用实践过程 ...

  4. servlet登录练习,并且记录访问次数

    Userservlet登录数据处理,包括访问页面次数处理: package com.szxy.test; import java.io.IOException; import javax.servle ...

  5. 数据库Oracle和MySQL 的不同

    实例区别: MySQL是轻量型数据库,开源免费.Oracle收费,这个不是重点,,重点是它贵. MySQL一个实例可以操作多个库,而Oracle一个实例只能对应一个库. MySQL安装只有300多兆, ...

  6. 基于iCamera测试光电大赛官方指定摄像头mt9m001调试小结

    基于iCamera测试光电大赛官方指定摄像头mt9m001调试小结 先看看官方的接口 组委会指定的模块接口 信号定义说明: VDD:3.3v GND:地 SCK:摄像头寄存器的iic配置信号的时钟线 ...

  7. HTTP请求流程你了解了么?

    我又回来了,先来波推广,最硬的资源来自公众号:前端美食汇,欢迎大家关注公众号获取最新的技术.提示,文末有福利,最硬的文章会首先发布在公众号上喔 预备知识 前文没有描述到传输和协议直接的层级对应关系,大 ...

  8. Java集合类框架的最佳实践?

    根据应用的需要选择合适的集合对性能是非常重要的.如果一个集合的元素数量是固定的,而且我们能够提前知道固定的数量,那么就可以使用数组,而不是ArrayList. 每个集合都可以设置初始容量,如果我们提前 ...

  9. Django day03之表设计分析

    models.py文件中创建表字段分析实例: 图书管理系统---> 书.作者.出版社作为基表 from django.db import models # Create your models ...

  10. 如何解决两个span标签之间的缝隙

    1.span直接一行 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...