Flask.1

Flask 中的MVC与MTV

MVC:

  Model:负责和数据交互

  View (==Template):负责数据展示

  Controller(==Views):控制器,接受用户输入,调用数据Model,展示数据

MTV:

  Model、Template、view

 

Flask启动参数

host:指定运行在哪些IP上,允许谁访问

debug:调试模式,代码修改后,服务器会自定重启

port:端口,默认5000

threaded:开启多线程模式,提升性能

 

项目结构:

static:可以直接被外部访问

templates:模版,必须在python代码中进行渲染

Python程序文件

 

route:

路由,获取路径参数

<>声明参数(类型:参数名。 例:<int:id>)

在视图函数中书写和生命的参数对应的参数

 

Http:

2xx:请求成功

3xx:重定向

4xx:客户端错误

5xx:服务器错误

 

app = Flask(__name__)

@app.route('/')
def hello():
    return render_template('index.html')#渲染index.html模版

启动服务器

app.run(debug=True)

 

模版渲染

变量{ { var } }

标签{ % tag % }

  block

  extends : 继承,扩展。子模块可以填充父类中的块,没有填充的块会被自动优化掉

  block + extends(更推荐):实现化整为零

    特性:

      extends继承:父模版没有要求

      block:

        首次出现的block,代表一种规划

        第二次出现的block,代表规划的填充

        第三次出现的block,代表对规划的填充,默认会覆盖第二次的填充,获取父模版中的内容实用 { { super() } }

  include:将其他html包含到自己的页面中,体现的一种由零聚一的思维

  宏定义:marco

        {% marco XXX(params) %}...{% endmacro %}

        定义好的宏可以被调用;

        定义好的宏可以被调用;

        macro可以被其它html导入:{% from xxx import yyy %}

                     {{ xxx() }} 调用

{% macro haha() %}

    <h1>你哈哈个啥</h1>

{% endmacro %}


{{ haha() }} #调用

 

 

#在html文件中清空所有,直接写下面代码,对应的块覆盖或继承
{% extends 'base.html' %}

{% block header %}
  
<h1>模板挺有意思哈</h1> {% endblock %}
{% extends 'home.html' %}

{% block header %}
    {{ super() }} #继承,不会覆盖
    <h2>你胡汉三又回来啦</h2>
{% endblock %}

 

 

for

 

  • {% for item in iters %}... {% endfor %}

  • 循环中存在循环变量存储(循环器) loop
    • index
    • revindex
    • first
    • last

if

  • 条件分支

  • {% if exp %}...{% endif %}

  • {% else %}

  • {% elif exp %}

 {% for hobby in hobbies %}
      {% if loop.first %}
          <li style="color: red">{{ hobby }}</li>
      {% elif loop.last %}
          <li style="color: green">{{ hobby|upper }}</li>
      {% else %}
          <li>{{ hobby|reverse }}</li>
      {% endif %}
 {% endfor %}

 

 

ORM

  • Object Relational Mapping

    • 对象关系映射

  • 将数据库转换为面向对象的操作

  • 通过操作对象就可以实现数据的增删改查

  • 如何理解ORM

    • ORM就是一个翻译机

  • 优点

    • 开发效率高

    • 可以对接多种数据库(移植性高)

    • 易于理解,便于维护

      • 将数据转换为面向对象编程

    • 实现了防SQL注入

  • 缺点

    • 执行效率低

      • 因为需要将对象的操作转换为数据库的SQL

    • 对于复杂操作可能没有支持

 

模型

  • 定义模型

  • 无非就是增删改查

    • 存储

      • 创建一个对象

      • 通过db.session.add

      • 最后记得commit

    • 删除

    • 修改

    • 查询

      • 类名.query.操作

        • all 拿所有 默认返回是 list

        • filter() 过滤

          • 过滤条件

            • 类名.属性名 操作符 值

            • 类名.属性名.操作符 值

          • 返回BaseQuery

          • 可以继续all

      • get(主键)

# 过滤
student_list = Student.query.filter(Student.score > 80).all()
student_list = Student.query.filter(Student.score > 60).filter(Student.score < 80).all()
student_list = Student.query.filter(Student.score.__lt__(60)).all()
student_list = Student.query.filter(Student.score.in_([60, 81, 100, 200])).all()


# order_by必须放在最前面   limit 和 offset无顺序   实际上都是先  offset再limit
student_list = Student.query.order_by("score").limit(4).offset(3).all()

# offset 为偏移查询 即跳过多少个再输出,limit为显示几个

 

 

 

 

# 创建数据库,sqlite可以不用有库,执行代码后自动创建text库
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///test.sqlite"

db = SQLAlchemy(app)

# 创建数据库表
class Student(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(32), unique=True)
    score = db.Column(db.Integer, default=60)

# 输入路由执行,成功创建User表
@app.route("/init/")
def init():
    db.create_all()
    return "初始化成功"

# 输入路由后向表里添加数据
@app.route("/addstudent/")
def add_student():
    student = Student(name="小明%d" % random.randrange(10000), score=random.randrange(100))
    
    db.session.add(student)
    db.session.commit()  # 向数据库提交,这一步必须有
    return "添加成功

 

 

模型过滤

  • filter之后对象类型是 BaseQuery

  • BaseQuery可以链式调用

    • Student.query.filter(xxx).filter().filter().filter() #不加.all() 返回的就是BaseQuery对象,加上.all()后返回的是列表,可以通过下标啊取值

 

Cookie和Session

 

# 存 cookie
response.set_cookie("username", "zbc") #储存username=“zbc”的用户,key-value

# 获取cookie
username = request.cookies.get("username")

# 干掉cooike
response.delete_cookie("username") 

 

# 存 session
session["username"] = "zbc"

# 取 session 
username = session.get("username")

# 干掉session
session.pop("username")
del session["username"]
session["username"] = None

# 持久化 session
session.permanent = True  # True 默认值为31天, False默认值为关闭网页
session.permanent_session_lifetime = timedelta(days=7)

 

转载于:https://www.cnblogs.com/zbcdamao/p/10881072.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值