1. Web框架简介
1.1 什么是Web框架
Web框架是用来简化Web开发的软件框架。框架的存在是为了避免重复劳动,典型的框架存在如下常用功能:
(1)管理路由
(2)访问数据库
(3)管理会话和Cookies
(4)创建模板来显示HTML
(5)促进代码的重用
1.2 常用的Web框架
框架 | 特点 |
Flask | 轻量级Web应用框架,将werkzeug和Jinja粘合在一起,容易扩展,适用于小项目。 |
Django | 使用最多的Web框架,有通用后台,一站式服务,但Django耦合度高,替换掉内置功能比较复杂。 |
Bottle | 微框架,只依赖Python标准库,有独特的模板语言。 |
Tornado | 为解决实时服务而诞生,使用了异步非阻塞IO技术,运行速度快。 |
2. Flask框架的使用
2.1 安装虚拟环境
(1)安装virtualenv
pip install virtualenv # 命令安装
virtualenv --version # 检测安装版本
(2)创建虚拟环境
CMD命令行下,进入项目路径 D: # 进入D盘
创建项目文件夹:midir Flask
进入项目文件夹,执行创建环境命令:virtualenv venv #venv是虚拟环境的名称
通过命令激活虚拟环境:venv\Scripts\activate
检查:pip list
2.2 安装Flask
# 命令安装
pip install flask
# 使用命令查看所有的安装包
pip list --format columns
可以看到安装了Flask以及两个外部依赖库:Werkzeug和Jinja2.
2.3 第一个Flask程序
例:输出“Hello World!”
在venv同级目录下,创建一个hello.py文件
from flask import Flask # 导入Flask
app = Flask(__name__) # 实例化Flask,并将其赋值给app,参数为应用模块或包的名称
@app.route('/') # 使用装饰器,定义路由,告诉Flask什么样的URL可以触发函数
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run() # run()函数让应用运行在本地服务器上
运行后,在浏览器中输入网址“http://127.0.0.1:5000/”,即可看到输出了Hello World!
2.5 路由
保存URL到Python函数的映射关系,处理URL和函数之间关系的程序成为路由。
在Flask程序中,最简单的定义路由的方法就是使用实例提供的app.route修饰器,把修饰的函数注册为路由,下面的例子说明了如何使用修饰器声明路由:
@app.route('/')
def hello_world():
return 'Hello World!'
如何构造含有动态部分的URL,以及在一个函数上附着多个规则
(1)变量规则
URL中变量的部分,使用尖括号标记<variable_name>,这个部分将会作为命名参数传递到你的函数,规则可以用<converter:variable_name>指定一个可选的转换器,其中converter为参数类型
(2)构造URL
使用url_for()来给指定的函数构造URL。它将会接受函数名作为第一个参数,也接受对应URL规则的变量部分的命名参数。
示例:使用url_for()函数获取URL信息
from flask import Flask,url_for # 引入Flsk,url_for模块
app = Flask(__name__) # 实例化Flask
...
@app.route('/url')
def get_url():
# 根据ID显示文章,ID是整型参数
return url_for('show_post',post_id=2)
if __name__ == '__main__':
app.run(debug=True) # 以调试状态运行应用
(3)HTTP方法
HTTP有许多不同的访问URL方法,默认情况下,路由只回应GET请求,使用route()装饰器传递methods参数可以改变这个行为。
@app.route('/login', methods == ['GET', 'POST'])
2.6 静态文件
动态Web应用也会需要静态文件,通常是CSS和JavaScript文件,存放在static文件夹下,在应用中使用‘/static’即可访问。
给静态文件生成URL,使用特殊的“static”端点名:
url_for('static', filename='style.css')
2.7 模板
模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道。
使用真实值替换变量,在范围最终得到的响应字符串,这一过程称为渲染,使用Jinja2模板引擎
(1)渲染模板
(2)变量
{{name}}结构表示一个变量,它是一种特殊的占位符,jinja2将从渲染模板中获取值,jinja2能识别所有类型的变量。
{{ mudict['key' ]}}:从字典中获取值
{{ mylist[3] }}:从列表中获取值
{{ mylist[myintvar] }}从列表中取一个带索引的值
{{ myobj.somemethod() }} 从对象的方法中获取一个值
使用过滤器,只用竖线|隔开
{{ name| capitalize}} # 该模板以首字母大写形式显示变量name的值
名称 | 说明 |
---|---|
safe | 渲染值时不转义(默认情况下,出于安全考虑,jinja2会转义所有变量) |
capitalize | 首字母大写,其余小写 |
lower | 把值转换为小写 |
upper | 把值转化为大写 |
title | 把值中的每个单子的首字母转换为大写 |
trim | 把值的首尾空格去掉 |
striptags | 渲染之前把值中所有的HTML标签都删掉 |
(3)控制结构
在模板中使用条件控制语句
{% if user %}
Hello,{{ user }}!
{% else %}
Hello, Stranger!
{% endif %}
通过for循环,实现在模板中渲染一组元素
<url>
{% for comment in comments %}
<li>{{ comment }}</li>
{% endfor %}
</url>