视图高级

类视图

标准类视图

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页面"
  1. 主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):