Flask学习笔记

  • 2-6 flask最小原型与唯一URL原则;注册路由时添加在/,可避免在浏览器中多输入/报错问题
@app.route('/index/', methods=['POST'])
def func():
    pass

# @app.route('/index', methods=['POST'])
# 若写为这种方式,在浏览器中多输入了/会报错

原理为flask使用重定向

  •  2-7 路由的另一种注册方法

开启修改代码后自动重启服务,开启debug模式后,若报错,会详细打印在浏览器上

# 使用flask的调试模式,当检测到文件变动会自动重启服务
app.run(debug=True)

# 另一种路由注册,建议使用装饰器方法。若基于类的视图,必须使用以下方法
app.add_url_rule('/index/',endpoint='index',view_func=index)

python装饰器不了解的,及时了解,python有特色的编码方式,可以解决耦合等很多问题。装饰器python语法基础很重要。

  • 2-8 app.run相关参数与flask配置文件
# 若要想让外网访问到,添加host参数配置。
# host也可以写本机ip地址,缺点换服务器后需要修改host参数。
# 指定0.0.0.0自动获取本地的ip
app.run(host="0.0.0.0", port=81, debug=True)


# flask加载配置文件,在启动文件同级目录下新建config.py文件,定义变量。
# 注意:from_object方式参数名必须全大写!!!
# 在启动文件的使用方法,先加载配置文件,再使用。
app.config.from_object('config')
print(app.config['DEBUG'])
  • 2-9 你并没有真正理解 if __name__的作用
# 这种启动方式只限用开发环境,生产环境中部署需要nginx+uwsgi
# 真正生产环境中app.run是不会被执行的
if __name__ == '__main__':
    app.run(host=app.config['URL'], port=app.config['PORT'], debug=app.config['DEBUG'])
  • 2-10 响应对象:Response
from flask import make_response

参考:https://www.jb51.net/article/217493.htm

  • 3-3 搜索关键字
# 路由中通过<>传递参数
# 定义路由,传递的参数名是name,因此需要在函数的形参中定义同名的参数
@app.route('/user/<name>')
def get_name(name):
    return "接收到的名称为: %s" % name

@app.route('/news/<int:id>')      
def list_news(id):
    return "接收到的id为: %s" % id

写if判断时,极可能满足条件放在前面,提高代码执行效率。

不管怎么写代码,至少保证视图函数里面代码简洁易懂。因为视图函数开启某一个web项目的起点。

过多的注释并不好

  • 3-5 requests发送http请求及代码的简化手段

 简化if else的代码:1.三目表达式;2.巧妙的用if+return(代码规范建议一个函数一个return)3.if else里的比较复杂代码再提取一个函数,for循环也适用。

  • 3-6 requests vs urllib

定义类的方法,静态方法:

  • 3-8 使用jsonify

返回json数据时适用jsonify

  • 3-9 将视图函数拆分到单独的文件中

不推荐将所有视图文件放到一个脚本文件中。1.不方便维护;2.不同业务模型分配到不同文件中。


  • 4-1 应用、蓝图与视图函数

flask注册时路由时适用到蓝图,在文件夹下新建__init__.py文件,使文件夹变为一个包。

然后在启动文件中引入此创建的函数

 蓝图注册原理

  • 4-4 request 对象

  •  4-5 WTForms参数验证

在验证传过来的参数是否合法,尽量使用WTForms验证,将验证函数单独提取出来。示例如下

# 在app文件夹下新建forms的文件夹,创建book.py脚本文件,代码如下

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


class SearchForm(Form):
    q = StringField(validators=[Length(min=1, max=30)])
    page = IntegerField(validators=[NumberRange(min=1, max=99)], default=1)
    # page = IntegerField(default=1)

    # def validate_page(self,field):
    #     number = field.isdigital


class SaveToMyGiftForm(Form):
    def validate_isbn(self, isbn):
        pass


class DriftForm(Form):
    recipient_name = StringField(
        '收件人姓名', validators=[DataRequired(), Length(min=2, max=20,
                                                    message='收件人姓名长度必须在2到20个字符之间')])
    mobile = StringField('手机号', validators=[DataRequired(),
                                            Regexp('^1[0-9]{10}$', 0, '请输入正确的手机号')])
    message = StringField('留言')
    address = StringField(
        '邮寄地址', validators=[DataRequired(),
                            Length(min=10, max=70, message='地址还不到10个字吗?尽量写详细一些吧')])

在调用校验结果时的代码为:

form = SearchForm(request.args)  # 调用校验的类
if form.validate():  # 判断是否为True
    # 获取校验后的参数,此写法可以获取到wtforms的默认值
    q = form.q.data.strip()
    page = form.page.data
  • 4-6 拆分配置文件

配置文件分为两个,分别为

secure.py,存放1.开发环境和生产环境不一致的配置,如debug;2.数据库连接密码等机密文件存到此文件

setting.py 存放开发环境和生产环境一直的配置。

还有一个好处,上传git时,可以不上传secure.py,只上传setting.py的文件。

配置文件读取过程:

# 从app中加载配置文件的过程,
# 在app文件夹下新建两个配置文件,__init__.py文件中creat_app的函数,将配置文件加载到app中。
    app.config.from_object('app.settings')
    app.config.from_object('app.secure')


# 获取配置信息,引入current_app
from flask import current_app
current_app.config['PER_PAGE']
  • 4-9 将模型映射到数据库中
# 在配置文件中定义数据库连接
SQLALCHEMY_DATABASE_URI = 'mysql+cymysql://root:7insummer@139.196.96.50:3307/fisher'

# 数据库定义如下

db = SQLAlchemy(query_class=Query)


class Base(db.Model):
    __abstract__ = True
    create_time = Column('create_time', Integer)
    status = Column(SmallInteger, default=1)

    def __init__(self):
        self.create_time = int(datetime.now().timestamp())

    @property
    def create_datetime(self):
        if self.create_time:
            return datetime.fromtimestamp(self.create_time)
        else:
            return None

    def delete(self):
        self.status = 0

    def set_attrs(self, attrs):
        for key, value in attrs.items():
            if hasattr(self, key) and key != 'id':
                setattr(self, key, value)


# 在app中注册
# 注册SQLAlchemy
db.init_app(app)
  • 4-10 ORM与CodeFirst区别

使用CodeFirst模式连接数据库

  • 5-3 详解flask上下文与出入栈

 

 对以上图片代码改写,使用with的方法

with实现要实现两个关键的函数

__exit__函数中返回True,异常不会抛到外面,若返回False,异常在外层抛出。

9.1 filter过滤器

    def intro(self):
        intros = filter(lambda x: True if x else False,
                        [self.author, self.publisher, self.price])
        return ' / '.join(intros)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值