视图高级
类视图
标准类视图
from flask import views
class XxxXx(views.View):
# 这个方法必须实现
def dispatch_request(self):
return xxxx
app.add_url_rule("URL", views_func= XxxXx.as_view('名字')
基于调度方法的类视图
from flask import views
class XssXs(views.MethodView):
def get(self):
pass
def post(self):
pass
app.add_url_rule("URL", views_func= XxxXx.as_view('名字')
蓝图
拆分模块,把模块独立出来
1,创建文件夹 blueprints
2, 把模块放到这个目录下面
news.py蓝图文件
from flask import Blueprint
xxx = Blueprint('news',__name__)
@xxx.route("/")
def xxx():
return xxxxx
app.py主文件
from blueprints.news import xxx
app.register_blueprint(xxx)
寻找模板文件
1.寻找templates目录下的模板文件
2. 如果templates目录下面没有找到,template_folder存在 在template_folder目录下面寻找模板文件
寻找静态资源文件
# 在static目录下:
<!-- <link rel="stylesheet" href="{{ url_for('static', filename='news.css') }}">-->
在蓝图中的static目录下
<link rel="stylesheet" href="{{ url_for('news.static', filename='news.css') }}">
news_bp = Blueprint('news', __name__, url_prefix="/news", static_folder='static')
子域名
1。 创建蓝图
from flask import Blueprint
cms_bp = Blueprint("cms", __name__,subdomain="cms")
@cms_bp.route("/")
def cms():
return "cms页面"
- 主app
app.config['SERVER_NAME'] = ‘xxx.com:port'
修改hosts文件
127.0.0.1 xxx.com
127.0.0.1 cms.xxx.com
数据库
介绍数据库
数据库特点
- 读写速度快
- 持久化存储
- 扩展好
- 数据的有效性
理解数据库
- 表: 字段 记录
通过SQLAlchemy连接
安装库
pip installpymysql
pip install sqlalchemy
pip install mysql-connector
连接数据库
from sqlalchemy import create_engine
HOSTNAME= “”
PORT=“”
USERNAME=“”
PASSWORD=“”
DATABASE=“”
DB_URL = ’mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD,HOSTNAME, PORT, DATABASE)
执行原生SQL语句
with engine.connect() as conn:
conn.execute('原生的SQL语句')
介绍ORM
ORM优点:
- 安全
- 封装原生的SQL
- 易用,简洁
ORM映射 - 类—表
- 属性—表中的字段
- 对象—一条数据
使用ORM映射到数据库
from sqlalchemy import create_engine # 创建引擎
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
# 连接数据库
# 地址
HOSTNAME = "127.0.0.1"
# 数据库
DATABASE = 'demo0417'
# 端口号
PORT = 3306
# 用户名和密码
USERNAME = 'root'
PASSWORD = 'root'
# 创建数据库引擎 mysql+pymysql
DB_URL = 'mysql+mysqlconnector://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD, HOSTNAME, PORT, DATABASE)
engine = create_engine(DB_URL)
# 都要继承这个函数生成的基类
Base = declarative_base(engine)
# ORM操作数据库
class students(Base):
# 定义表的名字,操作这张表
__tablename__ = 'students'
# 给一些字段 创建这张不存在的表 id name age gender
# column 数据类型 数据的约束 主键 自增 1 2 3
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(50), nullable=False)
gender = Column(Integer, default=1, comment= "1为男,2为女")
# 模型映射到数据库中
Base.metadata.create_all()
ORM增删改查
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Float
from sqlalchemy.orm import sessionmaker
def add():
user = User(xxx)
session.add(user)
session.add_all([user1, user2])
session.commit()
def search():
all()
first()
get(id)
filter(User.name=='xxx')
filter_by(name='xxx')
def update():
# 先查询
# 再修改
session.commit()
# 回滚
session.rollback()
def delete():
session.delete(对象)
session.commit()
SQLalchemy常用类型
- String
- Float
- Boolean
- time/Date/DateTime
- Enum
- LONGTEXT
- Text
- DECIMAL
- Integer
Column常用参数
- default
- name
- nullable
- autoincrement
- primary_key
- onupdate
聚合函数
from sqlalchem import func
max
min
count
avg
sum
session.query(sunc.聚合函数(模型,列名)).first()
过滤条件
- eq
filter(模型.字段 == 'xxx'.all()
- not eq
filter(模型.字段 !='xxx').all()
filter(~模型.字段 == 'xxx').all()
- and_
- like
session.query(Article).filter(Article.title.like('%title%')).all()
- or_
- in_
- notin
- None
Null !=空
- is_
外键及约束
from sqlalchemy import ForeignKey
uid = Column(Integer, ForeignKey('user.id', ondelete='SET NULL'))
# 外键查询
session.query(User).filter(User.id == Article.uid).first()
表关系
一对多
反向查询:
articles = relationship("Article", backref='author')
多对多
# 中间表
from sqlalchemy import Table
xxx = Table(
'表名字',
Base.metadata,
Column(外键),
Column(外键),
)
classes = relationship('Classes', backref='teachers', secondary = xxx)
一对一
排序
-session.query(模型).order_by(字段).all()
- 默认排序顺序 升序 asc
- 降序 desc()
- 在模型中定义
- mapper_args = {
“order_by”: 字段
}
查询出来的顺序就是order_by的顺序
limit offset 切片
-limit 条数
offset 偏移量
切片 python层面的切片
# 查询
article = session.query(Article).offset(0).limit(3).all()
article = session.query(Article).offset(4).limit(3).all()
分组和分组之后的刷选
group_by
前面查询的字段要和分组的字段保持一致
having
分组之后的筛选 不是对原始数据集进行查询
AQLAlchemy插件
-安装
pip install flask-sqlalchemy
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = "user
id = db.Column(db.Integer, primary_key=True, autoxxx)
name = db.Column(db.String(50))
class Article(db.Model):
xxxxxxxx=xxxxxxx
uid = db.Column(db.Integer, db.ForeignKey('user'))
author = sb.relationship('User', backref='articles')
db.drop_all()
db.create_all()
user = User(name='xx')
# User.query.all()
# db.session.query(User).all()
Flask-Script
安装
-pip install flask-script
在命令行执行自己定义的函数
from flask_script import Manager
from xx import app
manage = Manager(app)
@manager.command
def index():
print('hello')
给命令行传参数
@manager.option('-u', '-name', dest = 'username')
def info(username):
print(username)
python manage.py info -u xxx
项目目录
- static
- 静态资源文件
- templates
- 模板文件
- blueprint
- 蓝图
- models
- 模型
- config
- 配置文件
- forms
- 表单验证
- manage
- 数据库映射文件
- 项目入口文件
- app.py
映射数据库
python manage.py db init
python manage.py db migrate 不会真正的把模型映射到数据库
python manage.py db upgrade
表单验证
安装
pip install flask-wtf
注册表单验证
forms.py
from wtforms import Form
class LoginForm(Form):
username = StringField(Validators=[Length=(min=3, max=10, message='用户名长度不正确')]
常用的验证器
- EqualTo: 验证两个变量是否相等
- Email :邮箱
- InputRequired:必须输入
- Regexp:正则表达式
- URL:URL格式
- NumberRange:数字范围
- 文件上传: FileRequired 文件必须上传 。。。 FlieAllowed 文件允许上传的类型。。。。前端的form表单中 enctype属性。。。CombinedMultiDict
cookie 和session
cookie:
HTTP无状态 cookie 记录用户信息 保存在浏览器中!!!
from flask import Response
@app.route("xx")
def xx():
res = Response("xxx")
res.set_cookie()
key 键
value 值
max_age 过期时间 秒
domain 子域名
session:
保存在服务器中, 但是在flask中将session加密保存到cookie保存到浏览器中
from flask import session
app.config['SECRET_KEY'] = "随机字符串"
@app.route("xxx")
def xxx():
session['xx'] = 'xxx'
session.get('xxx') # 取值
session.pop('xxx') # 删除键值对应的session
session.clear() # 清空session
flask中的上下文
请求上下文
request
session
应用上下文
current_app
g对象
钩子函数 hook
@app.before_first_request #处理第一次请求
@app.before_request # 每次请求之前
@app.after_request # 每次请求之后
def xxx(response)
return response
@app.teardown_appcontext # 每次请求之后 不管有没有异常都会执行 debug关闭
def xxx(response):
return response
@app.context_processor # 上下文处理器返回数据到所有的模板中
def xxx(error):
@app.errorhandler(错误代码) # 关闭debug模式
def xxx(error):