day4

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
  1. 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()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.文件設(shè)置 1)djg1->settings->TEMPLATES->DIRS: 指定templates文件的路...
    曉曉的忍兒閱讀 613評論 0 1
  • Django是一個(gè)用 Python 編寫的 Web 框架。Web 框架是一種軟件,基于web框架可以開發(fā)動(dòng)態(tài)網(wǎng)站,...
    guanalex閱讀 7,502評論 0 5
  • 一、Django簡介 Django是用Python開發(fā)的一個(gè)免費(fèi)開源的Web框架,可以用于快速搭建高性能,優(yōu)雅的網(wǎng)...
    仙靈兒閱讀 3,508評論 0 5
  • 點(diǎn)我查看本文集的說明及目錄。 本項(xiàng)目相關(guān)內(nèi)容( github傳送 )包括: 實(shí)現(xiàn)過程: CH4 創(chuàng)建社交網(wǎng)站 CH...
    學(xué)以致用123閱讀 1,402評論 2 4
  • 6 跟蹤用戶動(dòng)作 在上一章中,你用jQuery實(shí)現(xiàn)了AJAX視圖,并構(gòu)建了一個(gè)分享其它網(wǎng)站內(nèi)容的JavaScrip...
    lakerszhy閱讀 1,297評論 0 1

友情鏈接更多精彩內(nèi)容