Flask实现轻博客(三):项目骨架

1. 最小的demo出发


web项目在实际上,是针对请求方发来的HTTP请求,做出相应的回应,把请求方请求的东西以文本形式返回给请求方,请求方的浏览器会解析文本,显示出来。

使用框架的好处就是省去了编写通信、处理URL等繁琐的过程。下面,介绍一下基于Flask,如何快速的搭建一个web项目骨架。

第一步,启动服务器。

'''
/config.py
    项目配置文件,处理log
'''

# -*- coding: utf-8 -*-
import logging
from logging import handlers


class Config():
    @staticmethod
    def init_app(app):
        log_file = "app.log"
        _handler = handlers.RotatingFileHandler(log_file, maxBytes=1024*1024, backupCount=1)
        formatter = logging.Formatter("%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s")
        _handler.setFormatter(formatter)
        _handler.setLevel(logging.WARNING)
        app.logger.addHandler(_handler)


class DefaultConfig(Config):
    pass


config = {
    'default': DefaultConfig
}

定义了Config基类,其中配置了一个log输出,用来记录访问服务器时出现的Warning。

使用基类的好处是,面对不同环境时,要实现不同的配置,只需要继承Config基类,并且加入到config字典中。调用对应的配置到字典中依据key查找就行了,便于扩展和维护。

'''
/app/__init__.py
    创建Flask类的实例,Flask框架为我们做的事情都围绕这个实例进行
'''

# -*- coding: utf-8 -*-
from flask import Flask
from config import config


def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    return app

创建Flask实例,并且将配置文件注册到app实例中。

'''
/manage.py
    项目入口,利用Flask-Scripts包管理
'''

# -*- coding: utf-8 -*-
from app import create_app, db
from flask_script import Manager


app = create_app("default")
manager = Manager(app)


if __name__ == "__main__":
    manager.run()

下面,运行python manage.py runserver命令,即可看到:

 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)  

此时只是启动服务器,Flask默认在5000端口监听请求。不过,现在还没有给服务器设置任何处理URL的方法,访问http://127.0.0.1:5000会得到404错误:127.0.0.1 - - [14/Sep/2016 16:53:58] "GET / HTTP/1.1" 404 -

第二步,处理请求。

Flask可以利用装饰器,把URL和处理函数关联起来(称为路由),省了很多工夫。

@app.route("/")
def index():
    return "Hello,world"

再次访问http://127.0.0.1:5000/时,就会跳转到这一函数,能看到界面上显示出“Hello,world”。

但是简单的添加路由给app实例是不行的。因为我们的需求要求有后台管理和前台显示两个模块,要求在Flask框架这一层把应用割裂。蓝图(Blueprint)可以完美的完成这一任务。

引用官方文档:对于一个类似 Twitter 的微型博客,我们可能有一个针对网站页面的蓝图,例如,index.html和about.html。接着我们还有另外一个带有登录面板的蓝图,在那里我们显示了所有最新的文章,然后我们还有一个用于后台管理的面板的蓝图。网站的每一个不同的区域也能够被分成不同区域的代码来实现。这能够让我们用几个小的 “apps” 构建我们的应用程序,每一个app都在做一件事情。

如下图,由路由注册给app转而把路由注册给蓝图,这样实现了应用的模块化。

Flask实现轻博客(三):项目骨架_第1张图片
路由注册给app
Flask实现轻博客(三):项目骨架_第2张图片
路由注册给蓝图

使用步骤如下:

首先,创建一个名为main的Blueprint实例,将路由函数与main绑定起来:

'''
/app/main/__init__.py
'''

# -*- coding: utf-8 -*-
from flask import Blueprint

main = Blueprint("main", __name__)

from . import views
'''
/app/main/views.py
'''

from . import main

@main.route("/")
def index():
    return "Hello,world"

然后,把main这一Blueprint实例注册到app实例中:

'''
/app/__init__.py
    更改:注册main蓝图
'''

# -*- coding: utf-8 -*-
from flask import Flask
from config import config


def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)
    
    from .main import main as main_blueprint
    main_blueprintapp.register_blueprint(main_blueprint)
    
    return app

重新运行运行python manage.py runserver命令,在浏览器中访问http://127.0.0.1:5000,可以看到“Hello,world”字样。

第三步,将处理结果填入前端模板。

上一步我们写了路由,可以处理对应的HTTP请求了,还需要把处理结果填入前端模板,总不能只返回一句hello world吧。更改蓝图中views.py文件,使用Flask提供的render_template方法来调用html文件。

'''
/app/main/views.py
    更改:调用指定的html文件,并传入参数
'''

from . import main
from flask import render_template

@main.route("/")
def index():
    article_list = ["foo", "foo", "foo", "foo"]
    return render_template("index.html", list=article_list)


    

效果图:

Flask实现轻博客(三):项目骨架_第3张图片
效果图

2. 总结


在上面,我们首先启动了一个服务器,然后处理请求,最后把结果以html的形式返回,web骨架已经搭起来了。下面博客要做的事情主要有:

  • admin后台管理。
  • 创建数据库,保存博客的数据,用户的数据。
  • 写更多的路由来处理不同的请求。如发布一篇博客,需要将新博客的数据存储到数据库中。查询博客,编辑博客等请求也是一样。
  • 美化模板,使用bootstrap模板。
    。。。

可以看出,这些功能都是在我们的项目骨架之下的,无非是路由处理请求时需要与数据库交互,增加新的admin蓝图而已。以后会进行说明。

下面是现在的项目文件夹:

D:\micro-blog>tree /F
卷 project 的文件夹 PATH 列表
D:.
│  app.log
│  config.py
│  manage.py
│
└─app
     │  models.py
     │  __init__.py
     │
     ├─admin
     ├─main
     │      views.py
     │      __init__.py
     │
     └─templates
               index.html

你可能感兴趣的:(Flask实现轻博客(三):项目骨架)