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转而把路由注册给蓝图,这样实现了应用的模块化。
使用步骤如下:
首先,创建一个名为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)
效果图:
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