• Flask 模板语言,装饰器


     

    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. 这两种都可以解决 装饰器问题  
  • 相关阅读:
    [转]Nvidia 的Shadow 文章收集
    [转]Linear Depth Buffer(线性深度缓冲区)
    [转]ParallelSplit Shadow Maps on Programmable GPUs
    [转]Learning to Love your Zbuffer.
    SQL SERVER存储过程中使用事务
    VS2005+SQL2005 Reporting Service动态绑定报表(Web)
    Sql批量删除/插入
    存储过程中执行动态Sql语句
    存储过程中使用事务
    真正的全动态报表:RDLC+ReportViewer
  • 原文地址:https://www.cnblogs.com/py-web/p/11995390.html
Copyright © 2020-2023  润新知