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网站开发速度。
(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)
模型之前的关联
一对多
在一的那一方,建立跟多的那一方的关联属性
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'))
多对多
多对多是通过建立中间表实现的。中间表值记录关系和存储关系字段。
这个中间表将互为多对多的关系表的主键设为外键。
这个关系表是直接建立的,不适用于模型类映射
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')
增删改查
增
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.过滤器.查询执⾏行行器器