DAY5-Flask项目

1.验证参数(WTForms):

当URL为/book/search?q= &page=1 时 ,p=空格,验证器会通过,在forms验证层的book.py文件中添加DataRequired验证器,防止用户只传送空格

from wtforms import Form, StringField, IntegerField
from wtforms.validators import Length, NumberRange, DataRequired

class SearchForm(Form):
    q = StringField(validators=[DataRequired(), Length(min=1, max=30)])#文本类型的变量,StringField对象创建
    page = IntegerField(validators=[NumberRange(min=1, max=99)], default=1) #default默认

2.拆分配置文件:

修改config.py:

secure.py:#此文件包含数据库密码账号等机密数据,生产环境相关的配置,此文件不应该上传到git

setting.py:#此文件保存生产环境和开发环境配置一样的配置参数和一些不机密 的参数

 yushu_book.py修改代码:by_keyworld搜索方式,传入的参数通过类的方法(编程思想:理由以后的修改)calculate_start 来添加

3.限制API访问数量(数据库初接触-Code First):

Code First:用代码来建立数据库!

业务逻辑应该写在MVC模型中的M(模型层)中!

调整文件结构:把自定义的模块放在libs文件下,把yushu_book.py放到spider文件夹中(以后作用会类似于爬虫)

模型层 MVC,新建models

使用Flask的第三方插件sqlalchemy来创建数据库:

from sqlalchemy import Column, Integer, String

class 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) #unique设为不重复
    summary = Column(String(1000))
    image = Column(String(50))

    def sample(self):
        pass

将模型对象book.py映射到数据库中要借助sqlalchemy实例化的对象:


from flask_sqlalchemy import SQLAlchemy

要把 SQLAlchemy对象插入到app核心对象中!!!!:

secure.py中指明数据库的连接(属于机密信息

 先要安装连接数据库的驱动(cymysql),先安装cymysql驱动:pipenv install cymysql

ORM:对象关系映射

4.Flask上下文:

Flask:核心对象

AppContext(应用上下文):核心对象的封装,附加了一些额外的参数

Request:保存了请求信息

RequestContext(请求上下文):Request的封装,附加了一些参数

编码时要使用核心对象和请求对象时,要从AppContextRequestContext间接的使用!!!

LocStack():本地代理

current_app返回的是核心对象app 不是应用上下文AppContext

同样的request返回的也不是RequestContext(请求上下文),而是Request

_find_app()方法:返回的是app 

_request_ctx_stack:RequestContext的实例化对象

_app_ctx_stack:应用级别的Flask实例化对象

Request push进栈之前,Flask首先会先检查_app_ctx_stack的栈顶是否为空,如果为空或者不是当前对象,那么Flask会把AppContext推入到栈中,然后再将Reques推进栈

current_apprequest始终指向栈顶,在使用current_app和request时实际上是在简介操作栈顶元素(实际上是上下文)。在栈顶是空的时候,使用urrent_app和request就会出现错误!

 所以要使用得到app对象,要确保应用上下文AppContext在栈中,

得到应用上下文对象方法:ctx = app.app_context()

推入栈中:ctx.push()

 当一个请求进入时,上下文会进栈,请求结束时在两个栈中就会被弹出栈

 弹出方法:pop(),所以:

在项目中的的这段代码:

没有push和pop的操作,是因为在请求中应用current_app时Flask自动推入栈

5.上下文的with语句:

进栈简洁方法使用with语句替换push()和pop():

什么时候使用with语句:

 

原文地址:https://www.cnblogs.com/xussi/p/9150675.html