1.配置views文件 apps/views
from flask import Blueprint, render_template, redirect, \
url_for, request
from app.models import db
blue = Blueprint('app', __name__)
@blue.route('/index/', methods=['GET'])
def index():
if request.method == 'GET':
return render_template('back/index.html')
# 傳入數(shù)據(jù)并渲染index頁面
@blue.route('/index1/', methods=['GET'])
def index1():
if request.method == 'GET':
data = ['Python', 'Vue', 'Linux', 'Celery', 'RabbitMQ',
'MySQL', 'MongoDB', 'Redis', 'Scrapy', 'Urllib',
'Requests', 'Selenium', 'Django',
'Flask', 'Tornado', 'Sanic']
content_h2 = '<h2>H2標(biāo)簽</h2>'
return render_template('back/index1.html',
data=data,
content_h2=content_h2)
# return render_template('web/index.html')
# 創(chuàng)建學(xué)生對象表
@blue.route('/create_db/', methods=['GET'])
def create_db():
# 創(chuàng)建所有模型對應(yīng)的表
db.create_all()
# 刪除所有模型對應(yīng)的表
# db.drop_all()
return '創(chuàng)建表成功'
2.模型文件 app/models
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
# 生成對象,ORM
db = SQLAlchemy()
1.一對多模型建立
class Grade(db.Model):
id = db.Column(db.Integer, primary_key=True)
g_name = db.Column(db.String(50))
stus = db.relationship('Student', backref='g')
# 建立外鍵聯(lián)系,設(shè)置返回g,提供反向引用聲明
__tablename__ = 'grade'
2.多對多模型建立
# 中間表course_student
# 兩個(gè)外鍵列c_id,s_id
c_s = db.Table('c_s',
db.Column('c_id', db.Integer, db.ForeignKey('course.id')),
db.Column('s_id', db.Integer, db.ForeignKey('stu.id'))
)
class Course(db.Model):
id = db.Column(db.Integer, primary_key=True)
c_name = db.Column(db.String(50), unique=True)
# 多對多的關(guān)聯(lián)關(guān)系可以寫在任何一方,反向引用c當(dāng)使用course查詢時(shí).stus,當(dāng)使用student查詢時(shí).c
stus = db.relationship('Student', secondary=c_s, backref='c')
__tablename__ = 'course'
# 定義模型
class Student(db.Model):
# 自增的int類型的主鍵,長度11位
id = db.Column(db.Integer, primary_key=True)
# 長度50,且唯一,且不能為空的s_name字段
s_name = db.Column(db.String(50), unique=True, nullable=False)
# 默認(rèn)為20的s_age字段
s_age = db.Column(db.Integer, default=20)
# 默認(rèn)為當(dāng)前時(shí)間的create_time字段
# django中默認(rèn)創(chuàng)建時(shí)間: auto_now_add=True,
# 修改時(shí)間:auto_now=True
create_time = db.Column(db.DateTime, default=datetime.now())
# 外鍵字段
s_g = db.Column(db.Integer, db.ForeignKey('grade.id'), nullable=True)
# 定義表名
__tablename__ = 'stu'
# def __str__(self):
def __repr__(self):
return '<Student ({})>'.format(self.id)
def save(self):
# 創(chuàng)建 、修改
db.session.add(self)
db.session.commit()
# def __init__(self, name):
#
# self.s_name=name
#
# def __new__(cls, *args, **kwargs):
#
# pass
#
# def __del__(self):
# # 析構(gòu)函數(shù),當(dāng)對象引用計(jì)數(shù)為0時(shí),被回收
# pass
- app/stu_views 學(xué)生視圖函數(shù)文件
stu_blue = Blueprint('stu', __name__)
1.創(chuàng)建藍(lán)圖
2.注冊路由
@stu_blue.route('/stu/', methods=['GET', 'POST', 'DELETE', 'PATCH'])
def stu():
if request.method == 'GET':
3.# 名字查詢
stu = Student.query.filter(Student.s_name == 'vincent').first()
print(stu)
# Django的ORM中,get(條件),如果條件不成立結(jié)果報(bào)錯(cuò),如果條件對應(yīng)多個(gè)結(jié)果則報(bào)錯(cuò)
# Flask中,get(主鍵值),查詢的是主鍵所對應(yīng)的數(shù)據(jù),查詢不到返回None
4. get根據(jù)主鍵查詢
stu = Student.query.get(20)
print(stu)
5. # 排序
# order_by()
# 升序order_by(Student.id)
# 降序order_by(-Student.id)
stus = Student.query.order_by(-Student.id).all()
print(stus)
6.分頁
# offset、limit
# offset偏移:跳過幾個(gè)元素
# limit: 截圖幾個(gè)元素
# django中Paginator()用于分頁
page = 3
stus = Student.query.offset((page - 1)*2).limit(2).all()
print(stus)
paginate(page, per_page, error_out=True)
# page 當(dāng)前頁數(shù)
# per_page 每頁顯示的條數(shù)
stus = Student.query.paginate(1, 2)
print(stus.items)
# 是否有上一頁: flask中has_prev django中has_previous
# 是否有下一頁: flask中has_next django中has_next
# 下一頁角碼: flask中next_num django中next_page_number
# 上一頁角碼: flask中prev_num django中previous_page_number
7.# 模糊查詢,icontains,and_、not_、or_,startswith, endswith, like
# contains like '%三%'
stus = Student.query.filter(Student.s_name.contains('三')).all()
stus = Student.query.filter(Student.s_name.like('%三%')).all()
print(stus)
# startswith like '三%'
stus = Student.query.filter(Student.s_name.startswith('三')).all()
stus = Student.query.filter(Student.s_name.like('三%')).all()
print(stus)
# endswith like '%三'
stus = Student.query.filter(Student.s_name.endswith('三')).all()
stus = Student.query.filter(Student.s_name.like('%三')).all()
print(stus)
# like % _
stus = Student.query.filter(Student.s_name.like('_三')).all()
print(stus)
# 與或非,django: 且
# filter(條件1,條件2,條件3) filter(Q(條件1),Q(條件2),Q(條件3))
# django :或
# filter(Q(條件1) | Q(條件2) | Q(條件3))
# django :非
# filter(~Q(條件1),Q(條件2),Q(條件3))
8.# 與或非,flask,and_,or_,not_
# 且操作, and_
stu = Student.query.filter(Student.s_name.like('%三%'))\
.filter(Student.s_age == 20).all()
stu = Student.query.filter(Student.s_name.like('%三%'),
Student.s_age == 20).all()
stu = Student.query.filter(and_(Student.s_name.like('%三%'),
Student.s_age == 20)).all()
# 或操作,or_
stus = Student.query.filter(or_(Student.s_name.like('%三%'),
Student.s_age == 20)).all()
# 非操作,not_
stus = Student.query.filter(not_(Student.s_name.like('%三%')),
Student.s_age == 20).all()
print(stus)
# django中: gt gte lt lte
9.# flask中: gt ge lt le > >= < <= ==
stus = Student.query.filter(Student.s_age.__gt__(20)).all()
stus = Student.query.filter(Student.s_age >= 20).all()
print(stus)
10.# in_ notin_
stus = Student.query.filter(Student.id.in_([1, 2, 3])).all()
stus = Student.query.filter(Student.id.notin_([1, 2, 3])).all()
print(stus)
return '查詢學(xué)生信息成功'
11.# 增操作
if request.method == 'POST':
# 創(chuàng)建一個(gè)學(xué)生對象信息
# 創(chuàng)建學(xué)生信息
# student = Student()
# student.s_name = 'admin'
# # add()方法只是在準(zhǔn)備向數(shù)據(jù)庫中插入數(shù)據(jù)
# db.session.add(student)
# # commit()事務(wù)提交,將數(shù)據(jù)插入到數(shù)據(jù)庫中
# db.session.commit()
# 創(chuàng)建多個(gè)學(xué)生對象信息
names = ['張三', 'coco', 'vincent', '李四']
stus = []
for name in names:
student = Student()
student.s_name = name
stus.append(student)
db.session.add_all(stus)
db.session.commit()
return '創(chuàng)建學(xué)生信息成功'
12.#刪除對象
if request.method == 'DELETE':
# Django中all()查詢結(jié)果為QuerySet,取第一個(gè)元素all().first()
# Flask中all()查詢結(jié)果為list,取第一個(gè)元素all()[0]
stus = Student.query.filter(Student.s_name == 'coco').all()
stu = Student.query.filter(Student.s_name == 'coco').first()
print(stu)
stu = Student.query.filter_by(s_name='coco').first()
print(stu)
# delete()刪除,接收刪除的對象
db.session.delete(stu)
db.session.commit()
return '刪除學(xué)生信息成功'
13.# 修改數(shù)據(jù)也使用add
if request.method == 'PATCH':
stu = Student.query.filter(Student.s_name == '李四').first()
stu.s_age = 33
stu.s_name = '小李'
# 修改數(shù)據(jù),add(修改對象)這句話可寫可不寫
# db.session.add(stu)
# db.session.commit()
stu.save()
return '修改學(xué)生信息成功'
14. # 修改數(shù)據(jù)
@stu_blue.route('/stu_grade/', methods=['GET'])
def stu_grade():
# 將id為1,2,3的學(xué)生分配到微電子學(xué)
stus = Student.query.filter(Student.id.in_([1,2,3])).all()
for stu in stus:
stu.s_g = 2
stu.save()
return '學(xué)生分配班級成功'
15. # 一對多的查詢使用
@stu_blue.route('/sel_stu_grade/', methods=['GET'])
def sel_stu_grade():
# 通過班級查詢學(xué)生內(nèi)容,一查多
grade = Grade.query.filter(Grade.g_name == '微電子學(xué)').first()
stus = grade.stus
# 通過學(xué)生查詢班級,多查一
stu = Student.query.filter(Student.s_name == 'admin').first()
grade = stu.g
return '查詢成功'
16. #
@stu_blue.route('/sel_stu_course/', methods=['GET'])
def sel_stu_course():
# 向中間表加信息
cou1 = Course.query.filter(Course.c_name == 'VHDL').first()
cou2 = Course.query.filter(Course.c_name == 'JAVA').first()
stus = Student.query.filter(Student.id.in_([1,2])).all()
# 獲取課程所關(guān)聯(lián)的學(xué)生信息
# print(cou1.stus)
# for stu in stus:
# cou1.stus.append(stu)
# print(cou1.stus)
# 向中間表加數(shù)據(jù),append,向中間表刪除數(shù)據(jù),remove
for stu in stus:
# stu.c.append(cou2)
stu.c.remove(cou2)
db.session.commit()
return '學(xué)生和課程'
4.templates/index.html 模板文件
{% block css %}
<!-- super()相當(dāng)于將父模板中坑css中已定義的內(nèi)容添加過來,如果直接繼承父模板中的坑,將會覆蓋坑中方法,所以需要使用
super()調(diào)用父模板方法并繼續(xù)重寫-->
{{ super() }}
<!-- 感嘆號不是jinja2語法, 注解使用{# 注解內(nèi)容 #} -->
{# 在django中模板語法: {% block.super %} #}
<!-- 樣式加載 -->
<link rel="stylesheet" href="/static/css/other.css">
{# django中加載樣式:{% load static %} {% static 'css/other.css' %} #}
<!-- 樣式加載2 -->
<link rel="stylesheet"
href="{{ url_for('static', filename='css/other.css') }}">
{% endblock %}
{# 標(biāo)簽: for、if、{% 標(biāo)簽 %} {% end標(biāo)簽 %} #}
{# {{ 變量 }}: 解析變量的值 #}
{{ data }}
<br>
{% for item in data %}
{% if item == 'Vue' %}
<span style="color:red;">{{ item }}</span>
{% else %}
{{ item }}
{% endif %}
{% endfor %}
<br>
{# flask中獲取data中第二個(gè)元素 #}
{# django中獲取data中第二個(gè)元素, data.1 #}
{{ data[1] }}
<br>
{{ content_h2 }}
{# 過濾器,使用管道符'|' ,safe加載樣式 striptags刪除格式#}
{{ content_h2 | safe }}
{{ content_h2 | striptags }}
{{ content_h2 | length }}
5.manage 管理文件
app = Flask(__name__)
app.register_blueprint(blueprint=blue)
app.register_blueprint(blueprint=stu_blue,url_prefix='/stu')
# 數(shù)據(jù)庫的配置
# mysql+pymysql://root:password@host:port/1902flask
# mysql+pymysql://root:@127.0.0.1:3306/1902flask
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@139.196.79.238:3306/1902flask'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
# 初始化方法,在views文件中創(chuàng)建db對象時(shí),未傳入app,則需調(diào)用init_app方法對app進(jìn)行初始化
if __name__ == '__main__':
manage = Manager(app)
manage.run()