好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

2016-01-04-1flaskweb开发(一)_html/css_WEB-ITnose

2016年, 看的第一本书, 作者是 Miguel Grinberg 安道翻译.

400 就是页面的state code. 后面涉及到定制错误页面时会涉及到.

Flask-Script

这里只有app.run()方法来定义嗠的启动, 但这样纯在Py-script中定义非常不方便, Flask-script是Flask扩展, 为Flask程序添加了命令行解析器. 自带了一组常用选项和自定义命令.

pip install flask-script

封装 & 使用

from flask.ext.script import Managermanager = Manager(app)... ...... ...if __name__ == "__main__":    manager.run() 

启动形式(usage):

python hello.py shell 用于维护任务和测试, 调试

python hello.py runserver 启动Web服务器 其下又可使用以下参数

-t HOST 或 --host -p PORT 或 --port --threaded --processes PROCESSES --passthrough-errors -d, --no-debug -r --no-reload

模板 Templates --- Jinja 2

上面的视图函数非常简单, 对于最简单的一类请求来说这就足够, 但一般而言, 请求会改变程序的状态, 这种变化也会在视图函数中产生.

考虑, 是一个用户在网站中的注册行为. 会有一个用户输入的表单(username, useremail, password, confirm password, valid code, ... ) , 服务器接受到用户的请求(带有信息)之后, Flask会把请求分发到处理注册机制的视图函数中, 这个视图函数需要访问数据库, 首先看看user是否已经在数据库了, 如果在则返回警告, 如果不在就继续验证密码是否符合规范, ... 直到满足条件生成一个新用户, 添加至数据库. 然后将响应回送至浏览器. 这个流程就涉及到了 业务逻辑 和 表现逻辑 .

两种逻辑的混淆就会大大增加代码的理解负担和维护成本.

模板是一个包含响应文本的文件. 其中用占位的方式表示了动态部分. 具体的值只在请求的context中才会知道. Flask使用Jinja2这一强大模板引擎.

Jinja2

首先看一个最简单的jinja2模板文件, user.html:

Hello, {{ name }}!

这个文件中使用 {{ xxx }}} 的方式定义了 name 这一动态变量, 后续要使用 外部渲染的方式进行传值.

from flask import ..., render_template ... @app.route('/user/ ')def user(name):    return render_template('user.html', name=name) 

这里再来简单介绍Jinja2的变量处理. 先来看支持的变量类型及格式

<h1>Hello, {{ name }}!</h1> str

<h1>Hello, {{ dict1['key'] }}!</h1> dict

<h1>Hello, {{ mylist[3] }}!</h1> list

<h1>Hello, {{ obj.somemethod() }}!</h1> function

其次, 若是需要一些变换, 也可以模板文件中来完成修改, 这一操作通过Jinja2的 过滤器 实现.

如:

{{ name|capitalize }} 完成首字母大写 {{ name|safe }} 渲染值是不转义 {{ name|upper }} 完成字母大写 {{ name|lower }} 完成字母小写 {{ name|trim }} 完成首尾空格去除 {{ name|striptags }} 渲染之前把值中所有HTML标签去掉.

转义: 默认情况下, Jinja2 会转义所有变量 --

Hello... 会被渲染成 '<h1>Hello .... , 浏览器能显示这个h1元素, 但不会进行解释. 千万不要在不可信的值上使用safe过滤器, 特别是用户在表单的输入.

完成的过滤器文档在 Jinja2文档

控制结构

渲染流程当然也涉及到结构的概念(先后顺序, 条件分支...), 参考下面的例子:

{% if user %}    Hello, {{ user }}!{% else %}    Hello, Stranger!{% endif %} 

除此之外, Jinja2还支持宏(macro, 类似于Python中的函数), 当涉及到重复渲染时, 可能会用到. 宏以外, 还可以使用 模板的继承.

模板继承

模板继承, 将不同页面中相同的元素抽象成一个block. 这是一个base范例

      {% block head %}     {% block title %}{% endblock %} - My Application     {% endblock %}      {% block body %}    {% endblock %}   

这个基模板就有3个block: head, title和body(注: title是嵌套在head之中的), 在继承时, 就可以使用了.

{% extends "base.html" %}{% block title %}Index{% endblock %}{% block head %}    {{ super() }}          {% endblock %}{% block body %}

Hello, World!

{% endblock %}

框架 - Bottstrap

Bootstrap( http://getbootstrap.com/ ) 是Twitter开发的一汞客户端框架, 提供了用户界面组件, 简洁有力, 兼容Web浏览器. 但因其不涉及服务器, 服务器使用还要提供 CSS和JS文件的HTML响应. Flask提供了拓展.

Flask-Bootstrap

pip install flask-bootstrap 初始化
from flask.ext.boostrap import Bootstrap bootstrap = Bootstrap(app) 
使用

在模板文件中继承,

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

从Flask-Bootstrap中extends了base基模板文件, 从而引入了Bootstrap中所有CSS和JS文件.

自定义错误页面

如果用户输入了错误的route 地址, 为了体现更好的体验, 保持完整统一性. 可通过自定义实现.

常见的错误代码有404: 客户请求未知页; 500, 有未处理的异常时显示.

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

404.html

{% extends "base.html" %}{% block title %}Flasky - Page Not Found{% endblock %}{% block page_content %}

Not Found

查看更多关于2016-01-04-1flaskweb开发(一)_html/css_WEB-ITnose的详细内容...

  阅读:31次