FLASK数据库模型( 二 )


@home.route('/article/')def query_detail(uuid):base_path = os.path.abspath('app/templates/article/')old_file = os.listdir(base_path)[0]old_path = os.path.join(base_path, old_file)file_path = os.path.abspath('app/templates/article/{}.html'.format(uuid))if not os.path.exists(file_path):log_v.debug("[-] File does not exist, renaming !!!")os.rename(old_path, file_path)form = CommentFormsearchForm = SearchFormarticle_res = Article.query.filter_by(uuid=uuid).firstarticle_detail_res = Article_Detail.query.filter_by(uid=article_res.id).firstreturn render_template('article/{}.html'.format(uuid), a_data=http://kandian.youth.cn/index/article_res, d_data=article_detail_res, form=form,searchForm=searchForm)思路设计:
在templates模板目录中新建一个article 用于存放文章详情页的html文件 , 并且索引到这个目录中 , 在这个目录中只有一个 html 文件 , 我们只需要向这个html文件填入查询回来的数据即可 。
由于文章列表需要根据文章的 uuid 来跳转到详情页 , 所以这个 html文件的名称需要 rename 为跳转文章的 uuid , 才能正确跳转 。
最后 , 根据 uuid 查询到文章 , 再由文章的 id 查询到详情文章内容 , 渲染到详情页 。
是不是及其简单 , 所以前期的工作主要是数据库模型字段的设计 , 还有迁移到数据库中 , 也就是创建表 , 让其工作 。
数据库迁移
使用 flask_migrate 扩展可以非常简单的进行数据库的迁移
# coding:utf8from datetime import datetimefrom flask_migrate import Migrate, MigrateCommandfrom app import appfrom app.models import dbfrom flask_script import Manager, Servermanage = Manager(app)# 迁移Migrate(app,db)manage.add_command('db',MigrateCommand)if __name__ == "__main__":manage.run'''初始化python manage.py db init创建迁移python manage.py db migrate执行迁移python manage.py db upgrade'''黑窗口 执行命令 python manage.py db init
初始化数据库 , 执行之后会在主 app 目录中生成一个 migrations 目录 , 里面包含了一些创建的信息 , 如 版本号 和 操作脚本 。
然后执行 python manage.py db migrate
迁移数据库 , 在数据库中真正创建表字段
最后执行 python manage.py db upgrade 让其生效
PS:在往后的每一次更改数据库模型中的字段之后 , 只需要执行后两个命令即可 。
关于数据库回滚
# -*- coding:utf-8 -*-import osfrom datetime import datetimefrom sqlalchemy import or_from app import app,dbfrom app.Logger.logger import log_vfrom app.forms import CommentForm, SearchFormfrom app.tools.getIdAddr import getAddrfrom app.home.home import homefrom flask import render_template, request, redirectfrom app.models import Article, Article_Detail, Global_V, Comment,UserIP@home.route('/postComment/', methods=['GET', 'POST'])def postComment(uuid):# app.config.update(SECRET_KEY=os.urandom(24))# log_v.debug("[*] UPDATE SECRET_KEY")log_v.debug("[+] Add Comment")form = CommentForm# 字段必须完整if request.method == "POST" and form.validate_on_submit:theme = form.theme.datacontent = form.content.dataemail = form.email.datacsrf_token = form.csrf_token.datat_md = request.form.get("t_md","")if all([theme, email, content, csrf_token, t_md]):try:add_comment = Comment(theme=theme, email=email, content=content, uuid=uuid)db.session.add(add_comment)db.session.commitreturn "评论成功"except Exception as e:db.session.rollbackreturn "评论失败"finally:log_v.debug("Comment Done " + theme + ' ' + ' ' + content + ' ' + email + ' ' + t_md)else:return "参数不齐"else:return redirect('/article/{}'.format(uuid))


推荐阅读