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

被折叠的 条评论
为什么被折叠?



