33

5. 使用Flask蓝图(blueprint)

 5 years ago
source link: https://studygolang.com/articles/15050?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一直到现在都没有怎么写代码,可能更得比较慢。

作业回顾

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

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

解决方案

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

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

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

  1. 官方文档

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

    Logbook官网

    vm6fEzJ.png!web

    image.png

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

  2. Github/Stack Overflow

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

    果断进入github,搜索logbook

    JvuYb2I.png!web

    image.png

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

    YJjQBbJ.png!web

    image.png

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

    I73uQn2.png!web

    image.png

    可以看到,这不是我们想要的答案,这些人和我们一样都是被困惑的。

    但没关系,我们可以利用刚才的搜索框。在搜索框中输入utc,我们优先看我们需要的问题。

    Z3QFviz.png!web

    image.png

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

    我们进入这个issue

    rU3mAjn.png!web

    image.png

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

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

    632qaqI.png!web

    image.png

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

    先上logger.py文件

import logbook

from .decorator import SingletonDecorator
from .. import app


@SingletonDecorator
class Log(object):

    handler = None

    def __init__(self, name='app', filename=app.config['LOG_NAME']):    # Logger标识默认为app
        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 server.app import app
from server.app.utils.logger import Log
from datetime import datetime

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


if __name__ == '__main__':
    app.run()
VBryiqn.png!web

image.png

  1. StackOverflow

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

使用蓝图blueprint

  • 引入目的

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

  • 使用方法

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

IrIfQfy.png!web

image.png

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

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

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

MziiQn7.png!web

image.png

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

那我们开始吧!

首先我们需要创建views文件夹,专门处理视图,负责调用controller的函数。举个栗子!

eqqueeR.png!web

image.png

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

User.py

from flask import Blueprint
from flask import jsonify

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

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

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

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

from flask import Flask

# 导入各个模块
from .views.auth.User import user
from ..config import Config

app = Flask(__name__)
app.register_blueprint(user)


app.config.from_object(Config)

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

FR77baA.png!web

image.png

然后进入浏览器,输入localhost:5000/user/register

yERBFfv.png!web

image.png

可以看到,这边msg并不是"注册成功"的中文,这个跟浏览器编码有关系。

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

总结

这样我们的一个蓝图就描绘完了,想起以前自己试着写jenkins的博客,写了2次就断更了。现在居然写了5篇,但是觉得如此效率太低了。可能以后只会编码了,会抽重点讲了~~

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

bq2Qje6.png!web

image.png

这个是最终效果~

上一篇: 为HelloWorld添加日志

下一篇: 暂无

github地址: https://github.com/wuranxu/Lamb


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK