加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

day94:flask:Jinjia2模板引擎&flask中的CSRF攻击&Flask-

发布时间:2020-12-20 09:58:55 所属栏目:Python 来源:网络整理
导读:目录 1.Jinjia2模板引擎 1.Jinjia2加载模板并传递数据到模板中 2.Jinjia2的模板语句 3.模板中特有的变量和函数 4.模板中内置的过滤器 5.自定义过滤器 6.模板继承 2.在flask中解决CSRF攻击 3.Flask-SQLAlchemy 1.Flask-SQLAlchemy简单介绍 2.安装 3.数据库连

目录

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判断>

<!-- 1.只有if循环 --> {% if info.age 18 %} <p>小明请出去> {% endif %}
2.if+else {% if info.age > 10 %} >小明同学 {% else %} >小明小朋友 3.if+elif+else 10 {% elif info.age >大明同学 {% endif %}

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开始?
loop.index0 显示本次循环的次数,从0开始?
loop.first 显示本次是否属于循环的第一次,是则为真?

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

1.Flask-SQLAlchemy简单介绍

flask默认提供模型操作,但是并没有提供ORM,所以一般开发的时候我们会采用flask-SQLAlchemy模块来实现ORM操作。

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.如果连接的是 mysql 数据库,需要安装 mysqldb 驱动

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
数据库链接配置 SQLALCHEMY_DATABASE_URI = "mysql://账号:密码@IP/数据库名?编码" SQLALCHEMY_DATABASE_URI = mysql://root:123@127.0.0.1:3306/students?charset=utf8mb4"

动态追踪修改设置,如未设置只会提示警告 SQLALCHEMY_TRACK_MODIFICATIONS = True

查询时会显示原始SQL语句 SQLALCHEMY_ECHO = True app.config.from_object(Config) db = SQLAlchemy() 初始化数据库操作对象 db.init_app(app) 初始化数据库连接

4.创建模型类

 Config():
    ......

app.config.from_object(Config)

db = SQLAlchemy()  初始化数据库连接

创建模型类""" Student(db.Model): __tablename__ = tb_student id = db.Column(db.Integer,primary_key=True,comment=主键ID) name = db.Column(db.String(250),1)">姓名) age = db.Column(db.Integer,1)">年龄) sex = db.Column(db.Boolean,default=False,1)">性别) money = db.Column(db.DECIMAL(8,2),nullable=True,1)">钱包) def __repr__(self): return self.name Teacher(db.Model): tb_teacher) option = db.Column(db.Enum(讲师助教班主任"),default=教职 Course(db.Model): tb_course课程名称) price = db.Column(db.Numeric(6,2)) self.name @app.route( index(): Ok: with app.app_context(): db.create_all() 根据模型创建所有的数据表 db.drop_all() 删除模型对应的所有数据表 app.run()

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()

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读