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一样的代码。

 

结果:

最后的结果显示不论是点击“登录”还是“首页”网页的标题一直在,并且文章内容为编辑的内容且点击首页是页面跳转后上显示首页。