使用Flask蓝图(blueprint)

回顾

先来看一下上一篇的作业吧,使用「logbook」的时候,遇到了时区不对的情况。那么我们怎么去解决这个问题呢?

实际上logbook默认采用的是世界标准时间(utc),而我们的北京时间是比世界标准时间早8个小时的。

解决方案

其实在我们工作中经常会遇到很多奇怪的问题,最最简单的方式就是使用搜索引擎搜索对应的报错信息。然后找到结果最接近的内容,一般在「Stack Overflow」 「segmentfault」 「简书」 「CSDN」 「博客园」 「开源中国」等社区可以找到对应的答案。

遇到问题其实并不可怕,我们有自己的套路去解决就好。

这里我介绍一下,我个人工作中的一些解决问题的方式吧。

  1. 官方文档

    一切大家常见的问题,基本上都会被写入到官方文档里。官方文档一般含有如何使用,以及一些需要注意的地方。

    Logbook官网


logbook官网截图

由于官网是英文版,所以需要有一定的英文基础。由于没有「搜索框」,所以只能暂时利用浏览器的ctrl+f搜索关键字了。试图搜索"time"和"utc"关键字,无果。

  1. Github/Stack Overflow

    作为一个star量1000+的opensource项目,必定会有一群侠义人士帮忙维护更新以及提出解决问题(这也是我选择它的原因)。所以肯定不只是我一个人遇到了时间的问题。

    果断进入github,搜索「logbook」

进入之后点击issues(问题)页面

可以看到,目前有32个打开的问题,里面都是关于大家使用问题之后的反馈。第一眼就看到了correct date这个问题,注意上面是有搜索框的,所以我们可以直接搜索utc。现在我们先不搜索, 进入查看一下。

可以看到,这不是我们想要的答案,这些人和我们一样都是被困惑的。但没关系,我们可以利用刚才的搜索框。在搜索框中输入「utc」,我们优先看我们需要的问题。

(简单的改变,可以允许展示本地时间)

我们进入这个issue

可以看到这是一个「pull requests」,简称pr。pr大概意思是说,虽然项目是A或者A团队做的,但是你有一些改进或者修复,可以提交pr并通过A审核过后将你的代码合并到master分支(这个好像是git教程了)。这里可以看到这人说他不想显示utc时间,但是又木有现有方法显示本地时间。

在一大堆巴拉巴拉及互相讨论以后,将api命名为「set_datetime_format」,好了,我们想要的东西拿到了。现在去代码里看看吧!

所以可以看到,我们调用logbook.set_datetime_format("local"),这样就能把时间设置为本地时间了。接着来测试一下~

先上logger.py文件

import logbook

from app import pity
from .decorator import SingletonDecorator

# 注意这里
@SingletonDecorator
class Log(object):
    handler = None

    def __init__(self, name='pity', filename=pity.config['LOG_NAME']):  # Logger标识默认为app
        """
        :param name: 业务名称
        :param filename: 文件名称
        """
        self.handler = logbook.FileHandler(filename, encoding='utf-8')
        logbook.set_datetime_format("local")  # 将日志时间设置为本地时间
        self.logger = logbook.Logger(name)
        self.handler.push_application()

    def info(self, *args, **kwargs):
        return self.logger.info(*args, **kwargs)

    def error(self, *args, **kwargs):
        return self.logger.error(*args, **kwargs)

    def warning(self, *args, **kwargs):
        return self.logger.warning(*args, **kwargs)

    def debug(self, *args, **kwargs):
        return self.logger.debug(*args, **kwargs)  

接下来测试一下修改后的hello world接口run.py

from datetime import datetime

from app import pity
from app.utils.logger import Log

@pity.route('/')
def hello_world():
    log = Log("hello world")
    log.info("有人访问了你的网站了")
    now = datetime.now().strftime("%Y-%M-%d %H:%M:%S")
    print(now)
    return now

if __name__ == "__main__":
    pity.run("0.0.0.0", threaded=True, port="7777")

  1. StackOverflow

    学习「golang」以来,时常会用到,所以大家可以多上去一下。虽然英文居多,但是也顺便培养下自己的阅读能力。好了,我要去给刚才那2个用户回答一下设置local_format_string了。


使用蓝图blueprint

  • 引入目的

    不知道大家有没有关注过浏览器的url情况,作为一个测试,比如我们会经常见到 「/login」 这些url,不同的url当然有自己不同的含义啦。如果我们接下来接口很多,比如一个user,需要有增删改查等接口,如果全部写在run.py里面,会太杂乱了。所以我们打算引入「蓝图」来帮我们解决这个问题。

  • 使用方法

    我一般都会抛出官网的实例,但是我这里推荐一本书,Flask相关的,我们叫它「狗书」。长下面这个样子~如果要深入学习flask的话,适合看看,也不厚重。

废话少说,今天作业讲太多了,正题没了。

由于我们做「前后端分离」,所以后端杜绝任何与html有关的东西,比如我如果现在要做用户模块的话。我需要我的url路径统一以/user开始,后面再按照内容划分。

以简书为例,大概讲一下,虽然这似乎是前端的路由。不过后端也差不多适应,大家可以了解下restful api的概念。

比如我这边的用户登录接口,我是打算这样命名: /user/register, 前面的user代表模块,后面代表内容。这样特别清晰明了。

那我们开始吧!

首先我们需要创建controller文件夹,专门处理路由和方法的映射。举个栗子!

这里我创建了auth(认证模块),又创建了「user.py」文件。

user.py

from flask import Blueprint
from flask import jsonify

auth = Blueprint("auth", __name__, url_prefix="/auth")

# 这里以auth.route注册的函数都会自带/auth,所以url是/auth/register
@auth.route("/register")
def register():
    return jsonify(dict(status=True, msg="注册成功"))

这里我直接return了json字符串: {"status": true, "msg": "注册成功"},因为我的具体函数还没开始写。

然后我们需要在app中注册这个蓝图! app/__init__.py代码如下

from flask import Flask

from app.controllers.auth.user import auth
from config import Config

pity = Flask(__name__)

# 注册蓝图
pity.register_blueprint(auth)

pity.config.from_object(Config)

好啦,我们重启run.py服务。

然后进入浏览器,输入localhost:7777/auth/register

可以看到,这边msg并不是「注册成功」的中文,这个跟字符编码有关系。

怎么解决这个问题呢,嘿嘿,还是我刚才说的,可以去搜索「flask jsonify」中文乱码。

总结

这样我们的一个蓝图就描绘完了,哈哈哈 断更的想法愈演愈烈,坚持呀~~

这就当做下次的作业吧,不过也是选修。毕竟给前端使用的话,问题不大。

这个是最终效果~

全部代码地址: https://github.com/wuranxu/pity

「觉得有用的话可以帮忙点个Star哦QAQ」

测试平台系列(4) 使用Flask蓝图(blueprint)的更多相关文章

  1. 测试平台系列(1) 搭建Flask服务

    搭建Flask服务 项目地址 点我进入项目地址 代码都会在这里有所展示,喜欢的话可以帮点个star,谢谢大家了!如果你喜欢该教程,也可以分享给其他人. 关于选型 想了很久,本来打算用「Gin」做为后端 ...

  2. 5. 使用Flask蓝图(blueprint)

    一直到现在都没有怎么写代码,可能更得比较慢. 作业回顾 先来看一下文章4的作业吧,使用logbook的时候,遇到了时区不对的情况.那么我们怎么去解决这个问题呢? 实际上logbook默认采用的是世界标 ...

  3. Flask 蓝图(Blueprint)

    蓝图使用起来就像应用当中的子应用一样,可以有自己的模板,静态目录,有自己的视图函数和URL规则,蓝图之间互相不影响.但是它们又属于应用中,可以共享应用的配置.对于大型应用来说,我们可以通过添加蓝图来扩 ...

  4. Python Flask 蓝图Blueprint

    1. 目录结构 2. manage.py类似于django中manage import fcrm if __name__ == '__main__': fcrm.app.run(port=8001) ...

  5. Flask蓝图Blueprint和特殊装饰器

    Flask 中的 蓝图 Blueprint 不能被run的flask实例:相当于django中的app01 应用 蓝图作用:功能隔离 路由隔离 Blueprint就是 一个不能run的flask 蓝图 ...

  6. flask蓝图blueprint是什么

    蓝图 blueprint 简单的说,就是帮助我们对flask程序进行目录结构的划分:django项目创建时,是自动生成项目目录,而在flask这里,需要我们自己来规划,这就需要blueprint来将整 ...

  7. Flask蓝图(Blueprint)

    一.作用 1.目录结构划分 2.url添加前缀 url_prefix 3.应用特殊装饰器,在该蓝图定义的特殊装饰器,只在改蓝图的起效 二.简单示例 1.创建一个项目文件 2.创建一个同名的python ...

  8. 测试平台系列(85) 把redis运用到实战中

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们让支持了前置条件 ...

  9. 测试平台系列(72) 了解ApScheduler基本用法

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们调研了一下市面上 ...

随机推荐

  1. SPF POJ - 1523 割点+并查集

    题意: 问你这个图中哪个点是割点,如果把这个点去掉会有几个子网 代码: 1 //给你几个点,用着几个点形成了一个图.输入边形成的图,问你这个图中有多少个割点.每一个割点去掉后会形成几个强连通分量 2 ...

  2. TextCNN论文解读

    引言 本文是对<Convolutional Neural Networks for Sentence Classification>的原理解读,简称TextCNN. 作者提出了一种基于CN ...

  3. springboot( 三)redis demo

    redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化.除此之外,Red ...

  4. Gym 101170I Iron and Coal(BFS + 思维)题解

    题意:有一个有向图,有些点是煤,有些点是铁,但不会同时有铁和煤.现在我要从1出发,占领可以到达的点.问最少占领几个点能同时拥有一个煤和一个铁(1不用占领). 思路:思路很秀啊.我们从1往外bfs,得到 ...

  5. 部署gitlab-01

    Gitlab Server 部署 1.环境配置 关闭防火墙.SELinux 开启邮件服务 systemctl start postfix systemctl enable postfix#ps:不开去 ...

  6. Java 对象的哈希值是每次 hashCode() 方法调用重计算么?

    对于没有覆盖hashCode()方法的对象 如果没有覆盖 hashCode() 方法,那么哈希值为底层 JDK C++ 源码实现,实例每次调用hashcode()方法,只有第一次计算哈希值,之后哈希值 ...

  7. Mac 外接 Dell 4K 显示器字体模糊解决办法

    Mac 外接 Dell 4K 显示器字体模糊解决办法 mac mini mbp 2020 refs https://zhuanlan.zhihu.com/p/52100804 xgqfrms 2012 ...

  8. GitHub new features 2020 All In One

    GitHub new features 2020 All In One Discussions Discussions is the space for your community to have ...

  9. Xcode 切换 iOS 模拟器的 Dark 模式

    Xcode 切换 iOS 模拟器的 Dark 模式 SwiftUI // // ContentView.swift // MemorizeGame // // Created by 夏凌晨 on 20 ...

  10. WebAR in Action

    WebAR in Action WebAR (Web + AR) 增强现实 https://developer.mozilla.org/en-US/docs/Web/API/WebAR_API Web ...