Flask页面解析与数据库基本操作

这篇博客主要介绍了Flask应用中的页面解析,包括Django和Flask两种方式加载静态资源,以及过滤器的使用。同时,文章还涵盖了项目的基本文件结构,如接口文档和依赖管理。在数据库部分,讲解了如何安装相关包,创建models,配置数据库连接,并强调了数据库事务的ACID原则。最后,展示了在视图中进行数据库增删改查的操作,并提醒在操作后需提交事务。

页面解析

  • 挖坑

    • block endblock
  • 加载css

  • django:

  • 第一种方式:

    • {% load static %}
  • 第二种方式:

  • flask:

  • 第一种方式:

  • 第二种方式:

  • 过滤器

    • safe:渲染标签
    • striptags:渲染之前去掉标签

    • trim:去掉空格

    • length:计算长度

    • 第一个字母{{ i|first }}

    • 最后一个字母{{ i|last }}
    • 小写{{ i|lower }}
    • 大写{{ i|upper }},
    • 首字母大写{{ i|capitalize }}
  • 宏(macro)

    • 类似于python中的函数
{% extends 'base_main.html' %}
{% block title %} 分数页面 {% endblock %}
{% block header %}
    <ul>
        {% for score in scores %}

            {% if loop.first %}
                <li style="color:red;">{{ loop.revindex }}:{{ loop.index }}:{{ score }}</li>
            {% elif loop.last %}
                <li style="color:green;">{{ loop.revindex }}:{{ loop.index }}:{{ score }}</li>
            {% else %}
                <li>{{ loop.revindex }}:{{ loop.index }}:{{ score }}</li>
            {% endif %}
        {% endfor %}
    </ul>
<hr>
<ul>
    <li>{{ content_h2 }}</li>
{#    加载样式#}
    <li>{{ content_h2|safe }}</li>
{#    去掉样式#}
    <li>{{ content_h2|striptags }}</li>
    <li>{{ content_h3 }}</li>
{#    判断长度#}
    <li>{{ content_h3|length }}</li>
{#    去掉空格,再次判断长度    #}
    <li>{{ content_h3|trim|length }}</li>

</ul>
{% from 'functions.html' import show_goods, say %}
 {{ show_goods('可爱多', '1') }}
 <br>
 {{ show_goods('梦龙', '2') }}
 <br>
 {{ say() }}
<ul>
{#config是全局的不需要后端传入#}
    {% for i in config %}
       <li>第一个字母{{ i|first }}, 最后一个字母{{ i|last }},
           单词小写{{ i|lower }}, 单词大写{{ i|upper }},
           首字母大写{{ i|capitalize }}
       </li>
    {% endfor %}
</ul>

{% endblock %}
  • 下面宏单独放在一个文件中,需要的时候可以导入使用,当做库来使用
{% macro show_goods(goods_name, goods_id) %}
    商品的id:  {{ goods_id }}
    商品的名称:{{ goods_name }}

{% endmacro %}
{% macro say() %}
    <h3> 呵呵 </h3>
{% endmacro %}
{% macro show_stus(id, name, age) %}
    学生id: {{ id }}
    学生姓名:{{ name }}
    学生年龄: {{ age }}
{% endmacro %}

项目中的一些基本的文件

  • doc
    • 接口文档
      • 接口
      • 请求类型
      • 参数
      • 响应
      • 参数说明
  • requirements
    • install.txt
      • 包的名字+版本号
      • 例如
      • Flask==1.0.2
      • Flask-Script==2.0.6
    • 安装所有包的命令
      • 可以安装txt文件中所有的包
      • pip install -r install.txt

数据库

  • 安装下面两个包
  • pip install flask-sqlalchemy
  • pip install pymysql

  • 创建models

  • primary_key:指定主键
  • autoincrement:自增
  • unique:唯一
  • default:默认值
  • Integer:整形
  • String:字符串

  • tablename:指定数据库名称

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()


class Student(db.Model):

    s_id = db.Column(db.Integer, primary_key=True, autoincrement=True)  # 整型,主键,自增
    s_name = db.Column(db.String(20), unique=True)  # 字符串, 唯一
    s_age = db.Column(db.Integer, default=18)  # 整型, 默认值

    __tablename__ = 'student'  # 表的名字
  • init文件中关联本地数据
  • SQLALCHEMY_DATABASE_URI=’mysql+pymysql://root:123456@localhost:3306/flask3’

  • 数据库事务

  • 原子性,一致性,隔离性,持久性
import os

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

from Stu.views import stu


def create_app():
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    templates_dir = os.path.join(BASE_DIR, 'templates')
    static_dir = os.path.join(BASE_DIR, 'static')
    app = Flask(__name__, template_folder=templates_dir, static_folder=static_dir)
    # 连接数据库
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost:3306/flask3'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

    app.register_blueprint(blueprint=stu, url_prefix='/stu')

    # 初识化app
    SQLAlchemy(app=app)
    return app
  • 在views中实现数据库的增删改查
    • 注意对数据库操作之后一定要commit,保证数据库的一致性
import random
from flask import Blueprint, render_template, redirect, url_for

from Stu.models import db, Student

stu = Blueprint('stu', __name__)
# 在数据创建表
@stu.route('/createtable')
def create_db():
    db.create_all()
    return '创建成功'


# 删除数据库的表
@stu.route('/droptable')
def drop_db():
    db.drop_all()
    return '删除成功'


@stu.route('/createstu')
def create_stu():

    stu = Student()
    stu.s_name = '小帅%d' % random.randrange(1000)
    stu.s_age = '%d' % random.randrange(20)

    db.session.add(stu)
    # 提交
    try:
        db.session.commit()
    except:
        # 为了保持一致性,如果数据提交不成功,回滚
        db.session.rollback()
    return '创建学生成功'


@stu.route('/stulist')
def stu_all():
    # 获取所有学生
    stus = Student.query.all()

    return render_template('stulist.html', stus=stus)


@stu.route('/studetail')
def stu_detail():
    # 使用原生sql语句
    # sql = 'select * from student where s_name="小帅999";'
    # stus = db.session.execute(sql)

    # 使用filter
    # stus = Student.query.filter(Student.s_name=='小帅999')

    # 使用filter_by
    stus = Student.query.filter_by(s_name='小帅999')
    return render_template('stulist.html', stus=stus)


@stu.route('/updatestu')
def update_stu():
    # 第一种方式
    # 如果不加first(),取到的不是一个对象,而是一个集合,所以应该选择第一个
    # stu = Student.query.filter_by(s_id=2).first()
    # stu.s_name = '李二狗'
    # db.session.commit()

    # 第二种方式
    Student.query.filter(Student.s_id==2).update({'s_name':'王大锤'})
    # 如果不加commit,不会将数据库改变,但是页面会发生改变,只是缓存变化
    db.session.commit()
    return redirect(url_for('stu.stu_all'))


@stu.route('/deletestu')
def delete_stu():
    # 删除
    stu = Student.query.filter(Student.s_id==2).first()
    db.session.delete(stu)
    db.session.commit()
    return redirect(url_for('stu.stu_all'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值