day94:flask:Jinjia2模板引擎&flask中的CSRF攻击&Flask-
目录1.Jinjia2模板引擎 1.Jinjia2加载模板并传递数据到模板中 2.Jinjia2的模板语句 3.模板中特有的变量和函数 4.模板中内置的过滤器 5.自定义过滤器 6.模板继承 2.在flask中解决CSRF攻击 3.Flask-SQLAlchemy 1.Flask-SQLAlchemy简单介绍 2.安装 3.数据库连接设置 4.创建模型类 5.数据基本操作:增删改查 1.Jinjia2模板引擎1.Jinjia2加载模板并传递数据到模板中1.设置template_folder参数 2.设置data: data["num"] = 100
3.传递data到模板: return render_template( "index1.html",**data )
from flask import Flask,render_template # 设置template_folder参数,创建template目录 app = Flask(__name__,template_folder="templates") @app.route(/) def index(): data = {} data[title"] = 我的第一个flask网页 data[num"] = 100 - render_template 函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值。 return render_template( index1.html",**data ) if __name__ == '__main__': app.run(debug=True) <!DOCTYPE html> <html lang="en"head> meta charset="UTF-8"title>Title</bodyh1>{{title}}p>num={{num}}html> 2.Jinjia2的模板语句{} 1.字典 data[info"] = { name":xiaoming,age":19sex:True,1)">class": 1009 } 2.列表 data[student_list"] = [xiaobaixiaoheixiaoan] 3.列表内嵌套字典 data[goods_list [ {id":10,1)">Python7天入门到放弃price":99.9,1)">":100},{":11,1)">Python3天入门到放弃":12,1)">Python5天入门到放弃":13,1)">Go7天入门到放弃":14,1)">Go5天入门到放弃":15,1)">Linux7天入门到放弃index2.html: app.run(debug=True) 1.访问字典数据中的成员访问字典数据中的成员,可以通过中括号取值或者点[.]取值 >访问字典数据中的成员>{{ info["name"] }}>{{ info.name }}> 2.访问列表数据中的成员访问列表数据中的成员,可以通过中括号索引取值或者点[.]取值 但是要注意:点[.]语法不支持负数下标 >{{ student_list.0 }}>{{ student_list.2 }}>{{ student_list[-1] }}>{{ student_list[2] }}> 3.模板中的if循环>if判断> 4.模板中的for循环>for循环 1.for+if/else --> ul {% for student in student_list %} {% if loop.last %} li style="background-color:#000;color:#fff;">{{ student }}li {% else %} {% endif %} {% endfor %} > 5.for循环中的loop用法loop 是jinja模板引擎提供给开发者获取循环中的信息对象? loop.index 显示本次循环的次数,从1开始? 2.for循环中loop的用法 {% for goods in goods_list %} {% if loop.index % 2 %} tr bgcolor="#00bfff"tr {% endif %} td>{{ loop.index0 }}> >{{ goods.id }}>{{ goods.name }}>{{ goods.price }}>{{ goods.num }}> {% endfor %} 3.模板中特有的变量和函数模板中特有的变量和函数:config,request,g变量,session,url_for() ) app.config[SECRET_KEY1234asda @app.route( {} session["]=xiaohuihui" 设置内置变量 index3.html 获取上下文对象 >{{ request.url }}> 获取当前请求url >{{ request.method }} 获取当前请求方法 --> >{{ session }} 获取session对象 >{{ session.name }} 获取session指定键对应的值 >{{ config.DEBUG }} 获取flask配置的debug的值 >{{ url_for("index") }} 获取url中后面的参数 --> > 4.模板中内置的过滤器当前flask应用运行的模块 static_folder=static 当前flask应用保存静态资源[css/js/img/音视频] static_url_path=/lib 当前flask应用提供给外界访问的路径前缀,必须以/开头 template_folder= ) app.config[messagehello,python,after 7 day,byebyeimages<img src='/lib/images/1.jpg'>" index4.html> img{ width: 100px; } >{{ message | upper }}> 变为大写 >{{ images | safe }} 禁用转义 >{{ message | reverse | upper }} 链式调用过滤器 >{{ 'em>hello>' | striptags }}>{{ "如果xy>x,那么x和z之间是否相等?" | striptags }}> <!-- 渲染之前把所有的html标签都删除掉 -->{{ '床前明月光,疑是地上霜。' | truncate(5,False,'...',0)}} 字符串截断 >{{ [1,1,2,3,4,5,4] | unique | list }} 列表去重 --> > 5.自定义过滤器" 1.自定义过滤器函数 do_mobile(content): return content[:3]+*****"+content[-3:] 2.将过滤器函数添加到template_filter中 app.add_template_filter(do_mobile,1)">mobilemobile_list [ 13513241123index5.html {% for mobile in mobile_list %} >{{ mobile | mobile }} 使用自定义过滤器 {% endfor %} > 6.模板继承当前flask应用运行的模块 template_folder= ) @app.route( {} index6.html: app.run(debug=True) base.html >{% block title %} 父级模板的内容 {% endblock %} {% block hander %} {% endblock hander %} {% block content %} >父级模板的content {% endblock content %} > index6.html {% extends "base.html" %} {% block title %}来自子模板的标题{% endblock title %} {% block hander %} script alert(1) {% endblock hander %} {% block content %} {{ super() }} >子模板的内容 {{ super() }} {% endblock %} 2.在flask中解决CSRF攻击1.安装pip3 install flask_wtf 2.flask-wtf使用步骤1.设置应用程序的 secret_key,用于加密生成的 csrf_token 的值 1. session加密的时候已经配置过了.如果没有在配置项中设置,则如下: app.secret_key = #此处可以写随机字符串# 2. 也可以写在配置类中。 class Config(object): DEBUG = True SECRET_KEY = dsad32DASSLD*13%^32" """加载配置""" app.config.from_object(Config) 2.导入 flask_wtf.csrf 中的 CSRFProtect 类,进行初始化,并在初始化的时候关联 app from flask.ext.wtf CSRFProtect csrf = CSRFProtect(app) 3.在表单中使用 CSRF 令牌 form method="post" action="/"input type="hidden" name="csrf_token" value="{{ csrf_token() }}" /> form> 3.使用CSRF完成简单的登录from flask_wtf CSRFProtect app = Flask( ) csrf = CSRFProtect(app) app.config[index7.htmldata ) @app.route(/loginPOST]) login(): print(request.form) return okdoctype html>Documentaction="{{ url_for('login') }}" method="post"> 账号: ="text"="username"=""><br 密码: ="password"="submit"="登录"> 3.Flask-SQLAlchemy1.Flask-SQLAlchemy简单介绍
SQLAlchemy是一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库的操作。flask-sqlalchemy 是一个简化了 SQLAlchemy 操作的flask扩展。 SQLAlchemy: https://www.sqlalchemy.org/ 中文文档: https://www.osgeo.cn/sqlalchemy/index.html 2.安装1.安装 flask-sqlalchemy【清华源】 pip install flask-sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple 2. pip install flask-mysqldb -i https://pypi.tuna.tsinghua.edu.cn/simple 3.安装flask-mysqldb时,注意 安装 flask-mysqldb的时候,python底层依赖于一个底层的模块 mysql-client模块 # 如果没有这个模块,则会报错如下: Command python setup.py egg_info" failed with error code 1 in /tmp/pip-install-21hysnd4/mysqlclient/ 解决方案: sudo apt-get install libmysqlclient-dev python3-dev 运行上面的安装命令如果再次报错如下: dpkg 被中断,您必须手工运行 ‘sudo dpkg --configure -a’ 解决此问题。 则根据提示执行命令以下命令,再次安装mysqlclient sudo dpkg --configure -a apt-get install libmysqlclient-dev python3- 解决了mysqlclient问题以后,重新安装 flask-mysqldb即可。 pip install flask-mysqldb -i https://pypi.tuna.tsinghua.edu.cn/simple 3.数据库连接设置from flask_sqlalchemy SQLAlchemy app = Flask(__name__) Config(): DEBUG = True 4.创建模型类Config(): ...... app.config.from_object(Config) db = SQLAlchemy() 初始化数据库连接 5.数据基本操作:增删改查1.添加一条数据1.模型类实例对象 2.add 3.commit student1 = Student(name=小明123456@qq.com) db.session.add(student1) db.session.commit() 再次插入一条数据 student2 = Student(name=小红',sex=False,age=13,1)">16565666@qq.com) db.session.add(student2) db.session.commit() 2.添加多条数据用add_all+commit st1 = Student(name=wangwang@163.com) st2 = Student(name=zhangzhang@189.com) st3 = Student(name=chenchen@126.com) st4 = Student(name=zhouzhou@163.com) st5 = Student(name=tangtang@163.com) st6 = Student(name=wuwu@gmail.com) st7 = Student(name=qianqian@gmail.com) st8 = Student(name=liuliu@163.com) st9 = Student(name=lili@163.com) st10 = Student(name=sunsun@163.com) db.session.add_all([st1,st2,st3,st4,st5,st6,st7,st8,st9,st10]) db.session.commit() 3.删除数据1.query+delete+commit 2.query.filter.delete()+commit? 方法1 student = Student.query.first() db.session.delete(student) db.session.commit() 方法2【事务中使用,就是乐观锁】 ret = Student.query.filter(Student.name==).delete() db.session.commit() 4.更新数据Student.query.first() student.name = dong' 直接通过对象.属性 来修改值 db.session.commit() 方法2【事务中使用,就是乐观锁】 ret = Student.query.filter(Student.name == ').update({money': 1000}) db.session.commit() 方法3【批量操作,实现类似django里面F函数的效果】 ret = Student.query.filter(Student.age == 22).update({Student.money: Student.money+200}) db.session.commit() ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |