Flask

Posted tyl23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask相关的知识,希望对你有一定的参考价值。

1.Flask:

Flask是python的web框架,最大的特征是轻便,让开发者自由灵活的兼容要开发的feature。

为什么要从Flask开始学习web框架?
1.python语言的灵活性给予了Flask同样的特征;
2.无论是用户画像还是产品推荐,python相比其他语言都有极大的优势;
3.Flask轻便,容易上手,试错成本低

Flask上手前提少,能够极大帮助初学者快速理解web开发.
(1)面向对象编程(Object-Oriented Programming, OOP)
相信绝大多数人都接触过OOP,比如使用Java, Python, Go等。在Flask中,涉及基础OOP的概念,包括对象、类、继承、封装等。
(2)python基础
Flask中涉及简单python概念,包括模块、包、装饰器、模块等。
(3)命令行基础
大部分的开发都绕不开命令行,Flask同样要求基础命令行操作,例如上传服务器、查询文件、修改配置文件等。
(4)数据库基础
web开发会产生数据管理的问题,虽然可以使用非数据库的方式搭建静态网页,但从长远来看将,掌握一门基础的数据库工具是很有必要的。比如结构化数据库mysql, Postgresql,非结构化的MongoDB, Redis等。
(5)前端基础
虽然搭建网站主要是后台逻辑编写,但今天越来越多的人在意前台展现,因此Flask除了后台python语言的要求外,还要求掌握基础的html, javascript, CSS。
(6)版本控制(增强)
版本控制是所有程序开发的基础,了解基础的版本控制可以大大提高开发的效率。掌握基础的git技能会提高Flask网站开发速度。
 
2.创建Flask项目
准备
mkvirtualenv flask_demo -p python3

安装

pip install flask==0.12.4
# 导入flask程序
from flask import Flask

# 初始化flask对象
app = Flask(__name__)
# 装饰器模式,新建路由,绑定index视图函数
@app.route("/index")
def index():
    return "index page"

# 判断当前的__name__ 是否是__main__
# __name__ : 如果做为单一模块运行,表示主模块名称:__main__
#            如果做为模块导入,那么就表示当前模块的名字
if __name__ == __main__:
    # 启动app
    app.run()

运行之后,在浏览器地址栏输入:http://127.0.0.1:5000/index

就可以看到视图函数返回的内容

Flask数据库基本操作

  • 在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。

    • 会话用 db.session 表示。在准备把数据写入数据库前,要先将数据添加到会话中然后调用 commit() 方法提交会话。
  • 在 Flask-SQLAlchemy 中,查询操作是通过 query 对象操作数据。

    • 最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询。

在视图函数中定义模型类

技术图片
from flask import Flask
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)

#设置连接数据库的URL
app.config[SQLALCHEMY_DATABASE_URI] = mysql://root:mysql@127.0.0.1:3306/test

app.config[SQLALCHEMY_TRACK_MODIFICATIONS] = True
#查询时会显示原始SQL语句
app.config[SQLALCHEMY_ECHO] = True
db = SQLAlchemy(app)

class Role(db.Model):
    # 定义表名
    __tablename__ = roles
    # 定义列对象
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    us = db.relationship(User, backref=role)

    #repr()方法显示一个可读字符串
    def __repr__(self):
        return Role:%s% self.name

class User(db.Model):
    __tablename__ = users
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, index=True)
    email = db.Column(db.String(64),unique=True)
    password = db.Column(db.String(64))
    role_id = db.Column(db.Integer, db.ForeignKey(roles.id))

    def __repr__(self):
        return User:%s%self.name
if __name__ == __main__:
    app.run(debug=True)
View Code

模型之前的关联

一对多

在一的那一方,建立跟多的那一方的关联属性

技术图片
class Role(db.Model):
    ...
    #关键代码
    us = db.relationship(User, backref=role, lazy=dynamic)
    ...

class User(db.Model):
    ...
    role_id = db.Column(db.Integer, db.ForeignKey(roles.id))
View Code

多对多

多对多是通过建立中间表实现的。中间表值记录关系和存储关系字段。

这个中间表将互为多对多的关系表的主键设为外键。

这个关系表是直接建立的,不适用于模型类映射

技术图片
registrations = db.Table(registrations,  
    db.Column(student_id, db.Integer, db.ForeignKey(students.id)),  
    db.Column(course_id, db.Integer, db.ForeignKey(courses.id))  
)  
class Course(db.Model):
    ...
class Student(db.Model):
    ...
    classes = db.relationship(Course,secondary=registrations,  
                                    backref=student,  
                                    lazy=dynamic)
View Code

增删改查

user = User(name = "lisi")
db.session.add(user)    # 将user添加到这个TCP会话当中,这个session就代表这个链接会话

user = User.query.get(1)
db.session.delete(user)
db.session.commit()

user = User.query.get(1)
user.name = "lisi"
db.session.commit()

语法:

模型类名.query.过滤器.查询执?行行器?

 

 







以上是关于Flask的主要内容,如果未能解决你的问题,请参考以下文章

12_关于flask中的宏

Flask之模板之宏继承包含

Flask模板宏的概念和基本使用

python flask(多对多表查询)

python后端 flask框架 计算时间差 并根据时间差条件返回flag值

python后端 flask框架 计算时间差 并根据时间差条件返回flag值