技巧 | 写 Flask 应用时的一些优雅技巧

Posted 编程派

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了技巧 | 写 Flask 应用时的一些优雅技巧相关的知识,希望对你有一定的参考价值。

原文链接:http://vimiix.com/post/2017/12/18/some-useful-tricks-in-flask/

  • 借助findmodules,importstring优雅地注册蓝图模块

  • 使用Flask中的flash闪存传递反馈信息

  • 使用Flask中内置日志系统发送错误日志邮件

  • 提前中断请求返回错误码,并定制相应错误页面

借助 find_modulesimport_string优雅地注册蓝图模块

find_modulesimport_string这两个函数包含在 werkzeug.utils工具包中,借助着两个工具函数可以帮助我们在更优雅的给应用注册 blueprint模块,尤其是当项目中 blueprint模块很多的时候,会节省很多行代码,看起来更加的舒服。

importstring(importname, silent=False)

import_string 可以通过字符串导出需要导入的模块或对象:

参数

  • import_name:要导入的对象的模块或对象名称

  • silent:如果设置为True,则忽略导入错误,相反则返回None

findmodules(importpath, include_packages=False, recursive=False)

找到一个包下面的所有模块,这对于自动导入所有蓝图模块是非常有用的

参数

  • import_path:包路径

  • include_packages:如果设置为True,会返回包内的子包

  • recursive:是否递归搜索子包

示例代码

blueprints/example.py

 
   
   
 
  1. # 模块部分

  2. # create  blueprint :)

  3. bp = Blueprint('bp_name', __name__)

app.py

 
   
   
 
  1. # 注册部分

  2. def register_blueprints(app):

  3.    """Register all blueprint modules"""

  4.    for name in find_modules('blueprints'):

  5.        module = import_string(name)

  6.        if hasattr(module, 'bp'):

  7.            app.register_blueprint(module.bp)

  8.    return None

使用Flask中的flash闪存传递反馈信息

flask的闪存系统主要是用来想用户提供反馈信息。内容一般是对用户上一次请求中的操作给出反馈。反馈信息存储在服务端,用户可以在本次(且只能在本次)请求中访问上一次的反馈信息,当用户获得了这些反馈信息以后,就会被服务端删除。Flask为jinja2开放了一个 get_flashed_messages(with_categories=False, category_filter=[])函数来获取上一次的闪存信息,这个函数可以直接在模板中使用。

参数

  • with_categories:True返回元祖,False返回消息本身

  • category_filter:过滤分类关键词(字符串或列表)

后台当请求结束准备返回的时候,使用 flash(message, category='message')函数来为下次请求保存一条反馈信息。

参数

  • message:信息文本

  • category:自定义分类关键词

官方示例代码]6

使用Flask中内置日志系统发送错误日志邮件

Flask使用python内置的日志系统,它实际上可以发送错误邮件。

示例代码:

 
   
   
 
  1. ADMINS = ['yourname@example.com']

  2. if not app.debug:

  3.    import logging

  4.    from logging.handlers import SMTPHandler

  5.    mail_handler = SMTPHandler('127.0.0.1', #邮件服务器

  6.                               'server-error@example.com', #发件人

  7.                               ADMINS, #收件人

  8.                               'YourApplication Failed') #邮件主题

  9.    mail_handler.setLevel(logging.ERROR)

  10.    app.logger.addHandler(mail_handler)

还可以更进一步,将错误日志格式化,方便阅读:

 
   
   
 
  1. from logging import Formatter

  2. mail_handler.setFormatter(Formatter('''

  3. Message type:       %(levelname)s

  4. Location:           %(pathname)s:%(lineno)d

  5. Module:             %(module)s

  6. Function:           %(funcName)s

  7. Time:               %(asctime)s

  8. Message:

  9. %(message)s

  10. '''))

关于SMTPHandler的介绍,访问官网SMTPHandler手册

提前中断请求返回错误码,并定制相应错误页面

在Flask中我们能够用 redirect()函数重定向用户到其它地方。还能够用 abort() 函数提前中断一个请求并带有一个错误代码。

示例代码

 
   
   
 
  1. from flask import abort, redirect, url_for

  2. @app.route('/')

  3. def index():

  4.    return redirect(url_for('login'))

  5. @app.route('/login')

  6. def login():

  7.    abort(404)

  8.    this_is_never_executed() # 永远不会被执行到

配合Flask提供的 errorhandler() 装饰器定制自己的相应错误界面

 
   
   
 
  1. from flask import render_template

  2. @app.errorhandler(404)

  3. def page_not_found(error):

  4.    return render_template('page_not_found.html'), 404

注意到 404 是在 render_template() 调用之后。告诉 Flask 该页的错误代码应是 404 , 即没有找到。


题图:pexels,CC0 授权。

点击阅读原文,查看更多 Python 教程和资源。

以上是关于技巧 | 写 Flask 应用时的一些优雅技巧的主要内容,如果未能解决你的问题,请参考以下文章

CSS 黑魔法小技巧,让你少写不必要的JS,代码更优雅

实用Javascript调试技巧

封装Vue组件的一些技巧

让你的JS更优雅的小技巧

优雅简洁5个快速提升 Python 代码能力的小技巧

9个小技巧让你的 if else看起来更优雅