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转而把路由注册给蓝图,这样实现了应用的模块化。

路由注册给app
路由注册给蓝图

使用步骤如下:

首先,创建一个名为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)
<!-- /templates/index.html -->

    <!-- 
         在templates文件夹中写入index.html文件,Flask会自动到这个文件夹中寻找。
         名字必须是templates。
         Flask基于Jinja模板引擎,能够将传入的list参数填充到html模板中。
         这里不再写html的具体实现。
    -->

效果图:

效果图

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容