flask–migrate

一、介绍:

因为采用‘db.craete_all’在后期修改字段的时候,不会自动的映射到数据库中,必须删除表,然后从新运行‘db.create_all’才会重新映射,这样不符合我们的请求。因为flask-migrate就是为了解决这个问题。她可以在每次修改模型后。可以将修改的东西映射到数据库中。

二、安装flask-migrate

Sudo pip insta ll flask-migrate
使用’flask-migrate’必须借助’flask_scrtipts’。这个包的‘MigrateCommand’中包含了所有和数据库相关的命令。

三、‘flask_migrate’相关的命令:

模型–>迁移文件–>表
*’pyhton manage.py db init’:初始化一个迁移脚本的环境。只需要执行一次
*‘python manage.py db migrater’:将模型生成迁移的文件,只要模型更改了,就只需要执行一遍这个命令。
*‘pyhton manage.py db upgrade’:将迁移文件真正的映射到数据库中。每次运行了‘migrate’的命令后,就只记得要运行这个命令。
注意点:
*需要将你想要映射到数据库中的模型,都要导入到’manage.py ‘文件中。如果没有导入进去,就不会映射到数据库中。
demo.py,存放主APP的文件

from flask import Flask 
from exst import db
import config
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
@app.route('/')
    return 'hello world'
if __name__ == '__main__':
    app.run(debug=True)

exst.py,存放db的文件

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

models.py,存放数据表

from exst import db
class Article(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    title= db.Column(db.String(100),nullable=False)

manage.py,存放flask-migrate和flask-script

from flask_script import Manager
from demo import app
from esxt import db
from models import Article
from flask_migrate import Migrate,MigrateCommand
manager = Manager(app)
migrate = Migrate(app,db)
manager.app_command('db',MigrateCommand)
if __name__ == '__main__':
    manager.run()

第一次在终端输入:

>pyhton manage.py db init
>python manage.py db migrate
>python manage.py db upgrade

下次再添加属性的时候,直接运行:

>pyhton manage.py db migrate
>python manage.py db upgrade

 

flask-models的解决循环的作用


###放开‘models’以及解决循坏引用:

  • 分开models的目的:为了让代码更加方便的管理。
  • 如何解决循坏引用:把‘db’放在一个单独的文件中,切断循环引用的线条就可以了。

#model_set.py文件,APP文件

末班from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
    return 'hello world'
if __name__ == '__main__':
    app.run(debug=True)

#exst.py文件,存放db

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

#models.py文件,存放数据表

from exst import db
class Article(db.Model):
    __tablename__ == 'article'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    title = db.Column(db.Srting(100),nullable=T=False)
    content = db.Column(db.eText,nullable=False)

#config.py ,建立数据库的文件

#连接数据库的格式
# dialect+driver://username:[email protected]:port/database
USERNAME = "root"
PASSWORD = "admin"
HOST = "127.0.0.1"
PORT = "3306"
DATABASE = "db_demo3"
DB_URI = "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(USERNAME,PASSWORD,HOST,PORT,DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = True
#注意:创建数据库之前必须登入数据库,创建一个DATABASE=‘xxx’xxx这个文件

结果:

 
 

flask-script–子命令的文件

当有数据库的时候
#demo.py文件

from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
    return 'hello world!'
if __name__ == '__main__':
    app.run(debug=True)

#namager.py文件

from flask_script import Manager
from dbmo.py import app
from demo_sql.py import DBmanager
manager = Manager(app)
#和数据库相关的操作,我都放在demo_sql.py文件中
@manager.command
def runserver():
     return '服务器跑起来了!'
if __name__ == '__main__':
    app.run(debug=True)

#demo_sql.py

from flask_script import Manager
DBmanager = Manager
@DBmanager.command
def init():
    print ('数据库初始化成功')
def migrate():
    print ('数据库迁移成功')

最后结果:

>python manager.py db init
>python manager.py migrate


 
 

Flask-script安装及简介

1.作用:通过命令行的形式来操作flask。例如:通过命令行跑一个开发版本服务器、设置数据库、定时任务等
2.安装:首先进入虚拟环境中,然后pip install flask-script来进行安装
3.如果直接在主’manager.py‘中写命令,那么在终端就值需要’pyhton manage.py command_name‘j就可以了。
4.如果把一些命令集中在一个文件中,那么在终端就只需要输入一个父命令,比如’python manager.py db init(函数名)‘。
例子:
#demo.py文件

demo.pyfrom flask imopr Flask
app = Flask(__name__)
@app.route('/')
def index():
     return 'Hello world!'
if __name__ == '__main__':
    app.run(debug=True)

#manager.py

from falsk_script import Manager
from demo import app
manager = Manager(app)
@Manager.command
def runserver():
    print ('服务器跑起来了')
if __name__ == '__main__':
    manager.run()

结果:

>python manager.py runserver

flask-外键及其关系

1.外键:
1).方便与主键建立关系
2).外键总是关联唯一的键字段
3).为关联字段创建外键

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
name = Flask(__name__)
app = config.from_object(config)
db = SQLAlchemy(app)
#创建一个user表
class User(db.Domel):
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    username = db.Column(db.String(100),nullable=False)
class Article(db.Domel):
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    title = db.Column(db.String(100),nullable=False)
    content = db.Column(db.Text,nullable=False)
    #author_id创建为外键
    author_id = db.Column(db.Integer,db.foreignKey('user.id'))
    #建立反向关系
    author = db.relationship('User',backref=db.backref('articles'))
db.areate_all()
@app.route('/')
def index():
    #给user表添加信息
    user = User(username='bingo')
    db.session.add(user)
    db.session.commit()
    #给article表添加两条信息
    article1 = Article(title='aaa',content='bbb')
    article1.author = User.query.filter(User.id == 1).first()
#因为articles表中有author_id这个属性,并且它与user表建立了外键关系所以这里是使author_id的键==user.id的键。
    db.session.add(article1)
    db.session.commit()
    article2 = Article(title='ddd',content='eee')
    article2.author = User.query.filter(User.id == 1).first()
    db.session.add(article2)
    db.session.commit()
    #找到文章标题为aaa的用户(title='aaa')
    article = Article.query.filter(Article.title=='aaa').first()
    print (article.user)
    #找到用户为bingo的所有文章
    user = User.query.filter(User.username=='bingo').first()
    result = user.articles
    for article in result:
        print (('*') * 10)
        print (article.title)
    return 'hello world'
if __name__ == '__main__':
    app.run(debug=True)

Flask–增、删、查、改

一下操作是在db.demo.py下的代码

from flask import Flask
from flask_sqlalchemy import AQLAlchemy
import config
name = Flask(__name__)
app = config.from_object(config)
db = SQLAlchemy(app)

#创建一个用户表

class User(db.Model):
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    username = db.Column(db.String(100),nullable=False)

#创建一个文章表

class Article(Model):
    __tablename__ = 'article'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    title = db.Column(db.String(100),nullable=False)
    content = db.Column(db.Text,nullable=False)
    author_id = db.Column(db.Integer,foreignKey(user.id) )
db.create_all()
@app.route('/')
def index():
    #增
    article1 = Article(title='aaa',content='bbb')
    db.session.add(article1)
    db.session.commit()
    author1 = User(username='bingo')
    db.session.add(author1)
    db.session.commit()
    #查
    result1 = User.query.filter(User.username='bingo').first()
    print (('id:%s') % result1.id)
    print (('username:%s') % result1.username)
    #改
    result1 = User.query.filter(User.username='bingo').first()
    result1.username = 'wingo'
    print (('username:%s') % result1.username)
    #删
    result2 = User.query.filter(User.username=bingo).first()
    db.session.delete(result2)
    db.session.commit()
    return 'Hello world!'

if name == “main“:
app.run(debug=True)

Flask–添加数据

demo1.py文件

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
name = Flask(__name__)
app = config.from_object(config)
db = SQLAlchemy(app)

#创建数据表

class Article(db.Model):
id = db.Colum(db.Integer,primary key=True,autoincerment=True)
tittle = db.Colum(db.String(100),nullable=False)
content = db.Colum(db.Text,nullable=False)
@app.route('/')
def index():

#向数据表中增加数据

article1 = Article(tittle='hello',content= 'bingo')
db.session.add(article1)
return 'Hello world!'
db.session.commit

config.py文件

# dialect+driver://username:[email protected]:port/database 主要的格式

  DIALECT = "mysql"
  DRIVER = "mysqldb"
  USERNAME = "root"
  PASSWORD = "xxx" #登录数据库的密码
  HOST = "127.0.0.1"
  PORT = "3306"
  DATABASE = "db_demo1"
  SQLALCHEMY_DATABASES_URL =  "{}+{}://{}:{}@{}:{}/{}?charset=utf-8".format(DIALECT,DRIVER,USERNAME,PASS    WORD,HOST,PORT,DATABASE

flask-连接数据库并建立数据表

db_demo1.py文件

from flask import Flask
from flask_sqlalchemy import
import config
app = Flask(name)
app = config.from_object(config)  #调用config.py这个脚本
db = SQLAlchemy(app)               #
#create table atricle(
#                                id int primary key autoincrement,
#                                title varchar(100) not null,
#                                content text not null);
 
class article(db.Model):
tablename = ‘article’
id = db.Column(db.Integer,primary key, autoincrement=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
:#网页首页
@app.route(‘/’)
def index():
return ‘Hello world’
 
if name == “main“:
app.run(debug=True)

config.py文件(DATABASE必须先创建)

#连接数据库的格式# dialect+driver://username:[email protected]:port/database
USERNAME = “root”
PASSWORD = “admin”
HOST = “127.0.0.1”
PORT = “3306”
DATABASE = “db_demo2”   #database要先进入数据库创建db_demo2
DB_URI = “mysql+mysqldb://{}:{}@{}:{}/{}?charset=utf8”.format(USERNAME,PASSWORD,HOST,PORT,DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = True

验证结果:

pyhton db_demo.py
mysql -u root -p #登录数据库,输入密码即可

>show databases;
>use db_demo2
>show tables;
>desc tables;

可看到所创建的数据表的格式了
 

flask-加载静态文件

###加载静态文件

  • 语法:’url_for(‘static’, filename=’路径’)’。

Eg:
<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8″>
<title>Document</title>
</head>
<body>
<link rel=”stylesheet” herf=”{{url_for(‘static’,filename=’css/index.css’)}}”>#加载静态css文件
</body>
</html>
Eg:
<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8″>
<title>Document</title>
</head>
<body>
<link rel=”stylesheet” herf={{url_for(“static”,filename=”js/index.js”)}}>#加载js文件
</body>
</html>
Eg:
<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8″>
<title>Document</title>
</head>
<body>
<link rel=”stylesheet” herf={{url_for(“static”, filename=”image/图片.png”)}}#加载图片
</body>
</html>
 
 

  • 静态文件:flask会从’static’文件夹中开始寻找,所有不需要再写’static’这个路径了。

可以加载’css’文件,可以加载’js’文件,还有’image’文件
@font-face { font-family: “Times New Roman”; }@font-face { font-family: “宋体”; }@font-face { font-family: “DejaVu Sans”; }@font-face { font-family: “Calibri”; }p.MsoNormal { margin: 0pt 0pt 0.0001pt; text-align: justify; font-family: Calibri; font-size: 10.5pt; }span.msoIns { text-decoration: underline; color: blue; }span.msoDel { text-decoration: line-through; color: red; }div.Section0 { }

flask–block

  • 继承作用和语法

*作用:可以把一些公共的代码放在父模板中,避免每个模板写同样的代码。
*语法:
‘’’
{% extend ‘base.html’ %}
‘’’
eg:
from flask import Flask,render_template
app = Flask(name)
#首页
@app.route(‘/’)
def index():
return render_template(‘static/index.html’)
#作者信息
@app.route(‘/about/’)
def article():
return render_template(‘static/author.html’)
#登录页面
@app.route(‘/login/’)
def login_in():
return render_template(‘static/login.html’)
templates/static/目录下有index.html、login.html、author.html、和父类base.html
base.html的内容如下:
<title>{% block main %}{% endblock%}</title> #定义一个main标签
<style>
.nav{ background:#000; height:85px;}
ul li{list-style:none; padding:0 20px; float:left;}
ul { overflow:hidden;}
.hh { color:#FFF;}
</style>
<body>
<div class=”nav”>
<ul>
<li><h3 class=”hh”>还是少年中</h3></li>
<li><a href=”/” class=”hh” style=”line-height:85px;”>首页</a></li>
<li><a href=”/archive/” class=”hh” style=”line-height:85px;”>归档</a></li>
<li><a href=”/about/” class=”hh” style=”line-height:85px;”>关于我</a></li>
<li><a href=”/login/” class=”hh” style=”line-height:85px;”>登录</a></li>
</ul>
</div>
</body>
{% block name %}{% endblock %}
子类文件夹有index.html、login.html、author.html
index.html
{% extends ‘static/base.html’ %} #extends是继承函数,此处为继承base.html这个父类的html文件
{% block name %}
<h1>这是首页</h1>
{% endblock %}
{% block main %}
首页
{% endblock%}
login/html和author.html一样的代码。
 
结果:
最后的结果显示不论是点击“登录”还是“首页”网页的标题一直在,并且文章内容为编辑的内容且点击首页是页面跳转后上显示首页。