Flask Web开发学习笔记(三)

本文主要整理下几个Flask扩展:

0.Flask-Bootstrap:集成Twitter开发的一个开源框架Bootstrap。
1.Flask-Script:为Flask程序添加一个命令行解析器
2.Flask-Moment:本地化日期和时间

本篇基于前两篇博文,需要使用虚拟环境、使用pip安装flask等。

0.什么是扩展

Flask被设计为可扩展形式,故而没有提供一些重要的功能,例如数据库和用户认证,所以我们可以选择最适合的程序的包,或者按需求自行开发。

说白了扩展就是一些附加功能,独立完成某种功能。

1.Flask-Bootstrap

Bootstrap 是 Twitter 开发的一个开源框架,它提供的用户界面组件可用于创建整洁且具有吸引力的网页,而且这些网页还能兼容所有现代 Web 浏览器。

Bootstrap是客户端框架,因此不会直接涉及服务器。

服务器需要做的指示提供引用了 Bootstrap 层叠样式表(CSS)和 Javascript 文件的 HTML 响应,并在 HTML、CSS 和 JavaScript 代码中实例化所需组件。这些操作最理想的执行场所就是模板

0.安装Flask-Bootstrap扩展

pip install flask-bootstrap

1.创建app.py文件

app.py文件中写入:

from flask import Flask,render_template
from flask.ext.bootstrap import Bootstrap

app = Flask(__name__)
bootstrap = Bootstrap(app)#注意这个地方 

@app.route('/')
def index():
    return render_template('index.html')

if __name__ == "__main__":
    app.run(debug = True)

解释下:

0.from flask.ext.bootstrap import Bootstrap:专为 Flask 开发的扩展都暴露在 flask.ext 命名空间下,Flask-Bootstrap 输出了一个 Bootstrap 类。

1.bootstrap = Bootstrap(app):Flask 扩展一般都在创建程序实例时初始化,这行代码是 Flask-Bootstrap 的初始化方法。

2.创建templates文件夹并创建base.html

base.html中写入:

{% extends "bootstrap/base.html"  %}

{% block title %}Flask{% endblock %}

{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/">Flasky</a>
        </div>
        <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li><a href="/">Home</a></li>
            </ul>
        </div>
    </div>
</div>
{% endblock %}

{% block content %}
<div class="container">
  {% block page_content %}{% endblock %}
</div>
{% endblock %}

解释下:

0.{% extends "bootstrap/base.html" %}:base.html模板继承自bootstrap/base.html

1.其中titlenavbarcontent都是bootstrap/base.html中定义的块(还有script等)。navbar是显示导航栏。其中的代码比较多,作用是添加Flasky和Home两个链接,理解下即可。

2.page_content块是自己加的。

3.以后的html页面直接继承base.html就可以啦。

3.创建index.html

index.html中写入:

{% extends "base.html" %}

{% block title %}首页{% endblock %}

{% block page_content %}
<h1>这里是首页,Hello World!</h1>
{% endblock %}

解释下:

0.{% extends "base.html" %}:继承自base.html

1.page_content块就是上面的自己定义的块。

4.运行程序

显示如下:

运行结果.png

2.Flask-Script

Flask的开发Web服务器支持很多启动设置选项,但只能在脚本中作为参数传给app.run()函数。这种方式很不方便,传递设置选项的理想方式是使用命令行参数。

Flask-Scrip就是这么一个Flask扩展,为Flask程序添加一个命令行解析器。Flask-Script自带了一组常用选项,而且还支持自定义命令。

0.安装Flask-Script扩展

pip install flask-script

1.修改app.py文件

from flask import Flask,render_template
from flask.ext.bootstrap import Bootstrap
from flask.ext.script import Manager

app = Flask(__name__)
manager = Manager(app)#注意这个地方

@app.route('/')
def index():
    return render_template('index.html')

if __name__ == "__main__":
    manager.run()#注意这个地方

解释下:

0.from flask.ext.script import Manager:Flask-Script输出了一个名为Manager的类,同样也是***flask.ext.XXX***下。

1.manager.run()代替了app.run(),启动后就能解析命令行啦。

2.使用Flask-Script

0.运行app.py:python app.py

1.Flask-Script官方文档

3.Flask-Moment

服务器需要统一时间单位,这和用户所在的地理位置无关,所以一般使用协调世界时间(Coordinated Universal Time,UTC)。用户不愿意看到UTC时间,他们更希望看到当地时间,而且采用当地惯用的格式。

要想在服务器上只使用UTC时间,一个优雅的解决方案是,把时间单位发送给Web浏览器。转换成当地时间,然后渲染。Web浏览器可以更好的完成这一任务,因为它能获取用户电脑中的时区和区域设置。

有一个使用JavaScript开发的优秀客户端开源代码,名为moment.js(http://momentjs.com/),它可以在浏览器中渲染日期和时间。

0.安装Flask-Moment扩展

pip install flask-moment

1.修改app.py文件

from flask import Flask,render_template
from flask.ext.bootstrap import Bootstrap
from flask.ext.script import Manager
from flask.ext.moment import Moment
from datetime import datetime

app = Flask(__name__)
manager = Manager(app)
bootstrap = Bootstrap(app)
moment = Moment(app)

@app.route('/')
def index():
    return render_template('index.html',current_time=datetime.utcnow())

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

解释下:

0.from flask.ext.moment import Moment:导入一个Moment类

1.from datetime import datetime:导入一个datetime类,用于获取UTC时间

2.moment = Moment(app):向模板开放了moment类,可以在模板中使用

3.current_time=datetime.utcnow():获取当前UTC时间,作为参数传入index.html

2.修改base.html

base.html修改为:

{% extends "bootstrap/base.html"  %}

{% block title %}Flask{% endblock %}

{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/">Flasky</a>
        </div>
        <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li><a href="/">Home</a></li>
            </ul>
        </div>
    </div>
</div>
{% endblock %}

{% block content %}
<div class="container">
  {% block page_content %}{% endblock %}
</div>

<!--注意下方block script-->
{% block scripts %}
{{  super() }}
{{ moment.include_moment() }}
{% endblock %}

{% endblock %}

解释下:

0.除了moment.js,Flask-Moment还依赖jquery.js。但是Bootstrap中已经引入了jquery.js,故只需要引入moment.js

1.{{ moment.include_moment() }}:引入moment.js,请注意上方的{{ super() }}

3.修改index.html

index.html内容修改为如下:

{% extends "base.html" %}

{% block title %}首页{% endblock %}

{% block page_content %}
<h1>这里是首页,Hello World!</h1>

<p>{{ moment(current_time).format('LLL') }}</p>
<p>{{ moment(current_time).fromNow(refresh=True) }}</p>

{% endblock %}

解释下:

0.{{ moment(current_time).format('LLL') }}:根据客户端电脑中的时区和区域设置渲染日期和时间。参数决定了渲染的方式,'L'到'LLL'分别对应不同的复杂度。format()函数还可以接受自定义的格式说明符。

1.{{ moment(current_time).fromNow(refresh=True) }}momentapp.py开放的类,current_timeapp.py传递过来的参数,fromNow()渲染相对时间戳,参数refresh=True会随着时间的推移自动刷新显示时间。

4.一个完整的Demo

这个Demo,包含上方未介绍到的东西:

0.url_for()函数的使用
1.静态文件的引入:设置网页的小图标(如百度网页的那个小熊掌)
2.自定义404错误页面

0.创建文件夹,包含文件

文件夹结构如下:

--app
    --app.py
    --templates
        --base.html
        --index.html
        --user.html
        --404.html
    --static
        --favicon.png
    --venv

1.app.py

from flask import Flask,render_template
from flask.ext.bootstrap import Bootstrap
from flask.ext.script import Manager
from flask.ext.moment import Moment
from datetime import datetime

app = Flask(__name__)
manager = Manager(app)
bootstrap = Bootstrap(app)
moment = Moment(app)

@app.route('/')
def index():
    return render_template('index.html',current_time=datetime.utcnow())

@app.route('/user/<name>')
def user(name):
    return render_template('user.html',name=name)

@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'),404

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

2.base.html

{% extends "bootstrap/base.html"  %}

{% block head %}
{{ super() }}
<link rel="shortcut icon" href="{{ url_for('static',filename = 'favicon.png') }}"  type='image/x-icon'/>
<link rel="icon" href="{{ url_for('static',filename = 'favicon.png')  }}" type="image/x-icon"/>
{% endblock %}

{% block title %}Flask{% endblock %}

{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/">Flasky</a>
        </div>
        <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li><a href="/">Home</a></li>
            </ul>
        </div>
    </div>
</div>
{% endblock %}

{% block content %}
<div class="container">
  {% block page_content %}{% endblock %}
</div>

{% block scripts %}
{{  super() }}
{{ moment.include_moment() }}
{% endblock %}

{% endblock %}

3.index.html

{% extends "base.html" %}

{% block title %}首页{% endblock %}

{% block page_content %}
<h1>这里是首页,Hello World!</h1>

<p>{{ moment(current_time).format('LLL') }}</p>
<p>{{ moment(current_time).fromNow(refresh=True) }}</p>

{% endblock %}

4.user.html

{% extends "base.html"  %}

{% block title %}User{% endblock %}

{% block page_content %}

{% if name %}
<h1> Hello {{ name }} </h1>
{% else  %}
<h1> Hello Stranger </h1>
{% endif %}

{% endblock %}

5.404.html

{% extends "base.html" %}

{% block title %} 404 {% endblock %}

{% block page_content %}
<h1>404错误:页面没有找到 </h1>
{% endblock %}

6.favicon.png

favicon.png

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

推荐阅读更多精彩内容