Flask(鱼书项目)学习笔记(二)——blueprint、WTForms、Mysql

文章目录

    • 蓝图 blueprint
      • 蓝图的定位
    • request对象接收请求参数
      • 知识点:
    • 使用WTForms插件进行参数验证
      • 验证层
    • 配置文件
    • 在Flask中操作Mysql数据库
      • Model模型层

蓝图 blueprint

app、蓝图与视图函数的结构如下:

Flask(鱼书项目)学习笔记(二)——blueprint、WTForms、Mysql_第1张图片

视图函数可以注册在蓝图下,也可以直接注册到app下。

蓝图注册方式如下:

web = Blueprint('web', __name__)

根据上面的结构,所有蓝图都要注册到app下

def register_web_blueprint(app):
    from app.web import web
    app.register_blueprint(web)


def create_app(config=None):
    app = Flask(__name__)

    #: load default configuration
    app.config.from_object('app.settings')
    app.config.from_object('app.secure')
    register_web_blueprint(app)

蓝图的定位

Blueprint是在大型项目中用来拆分模块的,比如web模块、api模块,并不适合在web中用来拆分文件。

request对象接收请求参数

?q=xx$page=xx要接收这样的传参方式包括Post请求,获取请求地址的ip可以用request对象进行参数接收。

request对象由flask负责构建、维护,可以直接从flask里面导入,使用方式为:page = request.args['page']

知识点:

request的实现方式是代理,不能在脱离flask上下文环境中进行调用。简单来说,只有在发生http请求的地方才能使用request,也就是视图函数以及视图函数中调用的子函数。

使用WTForms插件进行参数验证

验证层

最好是把验证的操作分离出来,作为一个单独的模块,用法详解

WTForms还可以用来进行表单验证,用法详解

class SearchForm(Form):
    q = StringField(validators=[DataRequired(), Length(min=1, max=30)])
    page = IntegerField(validators=[NumberRange(min=1, max=99)], default=1)
    
    
@web.route('/book/search', methods=['Get', 'POST'])
def search():
    form = SearchForm(request.args)

    if form.validate():
        q = form.q.data.strip()
        page = form.page.data
    else:
        return jsonify(form.errors)

验证之后的参数最好从form里取,因为里面定义了默认值。

配置文件

  • 配置文件最好拆分为两个,一个secure,一个settingsecure中存放一些需要保密的配置,比如数据库密码,且最好不要上传到git。setting中则存放一些开发环境和生辰环境中几乎一样的配置。
  • 导入配置文件中的配置时尽量不要import主文件中的app,使用flask中的current_app可以达到同样的效果,current_app.config['PER_PAGE']

在Flask中操作Mysql数据库

数据表的创建方式:

  1. Database First:直接在数据库中创建表
  2. Model First:使用powerdesigner等建模工具创建模型,再由模型生成表
  3. Code First:使用代码直接生成数据库表,专注业务模型的设计,而不是数据库的设计。

Model模型层

新建models文件夹用于存放Model类。

导入Flask_SQLAlchemy包,创建模型类并将模型类映射到数据库。

首先是创建模型类:

class Book(db.Model):
    """
        一些属性定义重复性比较大,元类可以解决这个问题
    """
    __tablename__ = 'book'

    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(50), nullable=False)
    _author = Column('author', String(30), default='未名')
    binding = Column(String(20))
    publisher = Column(String(50))
    price = Column(String(20))
    pages = Column(Integer)
    pubdate = Column(String(20))
    isbn = Column(String(15), nullable=False, unique=True)
    summary = Column(String(1000))
    image = Column(String(50))

然后在init文件中注册SQLAlchemy

def create_app():
    app = Flask(__name__)

    #: load default configuration
    app.config.from_object('app.settings')
    app.config.from_object('app.secure')

    # 注册SQLAlchemy
    db.init_app(app)
    # 生成数据库表
    db.create_all(app=app)

并在secure配置文件中配置数据库地址

SQLALCHEMY_DATABASE_URI = 'mysql+cymysql://root:[email protected]:3307/fisher'
其他相关资料已经同步到我的博客网站,欢迎访问我的个人博客了解更多内容。

你可能感兴趣的:(flask,python,mysql,flask)