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.过滤器.查询执⾏行行器器

 

 







posted @ 2019-11-06 22:19  林卿  阅读(195)  评论(0编辑  收藏  举报