一、Http流程:
二、框架概念
2.1Web框架:
能够被服务器调用起来,根据客户端的不同请求执行不同的逻辑处理形成要返回的数据的程序核心:
实现路由和视图(业务逻辑处理)
2.2框架的轻重:
重量级的框架:为方便业务程序的开发,提供了丰富的工具、组件,如Django
轻量级的框架:只提供Web框架的核心功能,自由、灵活、高度定制,如Flask、Tornado
2.3虚拟环境的搭建:
pip freeze > requirements.txt (将虚拟环境安装的包导出到txt文件中)
pip install –r requirements.txt (使用pip批量下载txt文件中的包)
三、了解Flask
3.1简介:Flask诞生于2010年,是Armin ronacher(人名)用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。它主要面向需求简单的小应用。Flask本身相当于一个内核,其他几乎所有的功能都需要用第三方的扩展来实现。
Flask框架的核心就是Werkzeug(路由模块)和Jinja2(模块引擎)
3.2地位:Python最出名的框架要数Django,此外还有Flask、Tornado等框架。虽然Flask不是最出名的框架,但是Flask应该算是最灵活的框架之一,这也是Flask受到广大开发者喜爱的原因。
3.3Flask的扩展包:
Flask-SQLalchemy:操作数据库;
Flask-migrate:管理迁移数据库;
Flask-Mail:邮件;
Flask-WTF:表单;
Flask-script:插入脚本;
Flask-Login:认证用户状态;
Flask-RESTful:开发REST API的工具;
Flask-Bootstrap:集成前端Twitter Bootstrap框架;
Flask-Moment:本地化日期和时间;
四、第一个Flask程序
# 导入Flask类
from flask import Flask
#Flask类接收一个参数__name__
app = Flask(__name__)
# 装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
return 'Hello World'
# Flask应用程序实例的run方法启动WEB服务器
if __name__ == '__main__':
app.run()
五、Flask的配置参数设置
5.1. 使用配置文件:
app.config.from_pyfile("config.cfg")
5.2. 使用对象配置参数:
class Config(object):
DEBUG = True
ITCAST = "python"
app.config.from_object(Config)
5.3. 直接操作config的字典对象:
app.config["DEBUG"] = True
总结:Flask中使用最多的配置方式是使用对象配置参数
六、Flask的路由配置
6.1限制路由的访问方式:
@app.route('/sample',methods=['GET', 'POST'])
6.2使用url_for进行反解析
6.3动态路由:
@app.route('/user/<int:id>') #尖括号中冒号左边为参数的类型,右边为参数的名字
6.4转换器:
from flask import Flask
from werkzeug.routing import BaseConverter#从werkzeug工具包中导入识别正则表达式的包
class Regex_url(BaseConverter): #自定义转换器类,继承包
def __init__(self, url_map, *args):
super(Regex_url, self).__init__(url_map) #继承父类的方法,初始化路由配置
self.regex = args[0] #将传入的正则表达式进行解析
app = Flask(__name__)
app.url_map.converters['re'] = Regex_url #将写好的转换器类导入应用中
@app.route('/user/<re("[a-z]{3}"):id>') #使用转换器
def hello_itcast(id):
return 'hello %s' %id
七、Flask的各种功能和组件
7.1获取请求参数(request):
from flask importrequest
#request中包含了前端发送过来的所有请求数据
# form和data是用来提取请求体数据
# 通过requset.form可以直接提取请求体中的表单格式的数据, 是一个类字典的对象
# 通过get方法只能拿到多个同名参数的第一个
示例:name = request.form.get("name")
7.2上传文件:
@app.route("/upload", methods=["POST"])
def upload():
"""接受前端传送过来的文件"""
file_obj = request.files.get("pic")
# 直接使用上传的文件对象保存
file_obj.save("./demo1.png")
return "上传成功"
7.3with语句的使用:
with Foo() as foo:
#进入with语句的时候,with帮助我们调用对象的__enter__方法,
#离开with语句的时候,with帮助我们调用对象的__exit__方法
7.4abort函数的使用:
from flask import abort, Response
# 使用abort函数可以立即终止视图函数的执行
# 并可以返回给前端特定的信息
# 传递状态码信息, 必须是标准的http状态码
abort(404)
7.5自定义错误处理函数:
# 定义错误处理的方法
@app.errorhandler(404)
def handle_404_error(err):
"""自定义的处理错误方法"""
# 这个函数的返回值会是前端用户看到的最终结果
return u"出现了404错误, 错误信息:%s" % err
7.6设置响应信息:
from flask import make_response
# 使用make_response 来构造响应信息
resp =make_response("index page 2")
resp.status = "999 itcast" # 设置状态码
resp.headers["city"] = "sz" # 设置响应头
return resp
7.7返回json数据的方法:
from flask import Flask,jsonify
return jsonify(city="sz", country="china")
7.8cookie的使用:
# 设置cookie, 默认有效期是临时cookie,浏览器关闭就失效
# max_age设置有效期,单位:秒
resp.set_cookie("Itcast2", "Python1", max_age=3600)
c = request.cookies.get("Itcast")
7.9session的使用:
7.9.1 flask的session需要用到的秘钥字符串:
from flask import session
app.config["SECRET_KEY"] = "dhsodfhisfhosdhf29fy989"
7.9.2session的机制:
7.10上下文的使用:
请求上下文(request context)
request和session都属于请求上下文对象。
应用上下文(application context)
current_app和g都属于应用上下文对象。
current_app:表示当前运行程序文件的程序实例。
g:处理请求时,用于临时存储的对象,每次请求都会重设这个变量。
7.11请求钩子:
请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
before_first_request:在处理第一个请求前运行。
before_request:在每次请求前运行。
after_request(response):如果没有未处理的异常抛出,在每次请求后运行。
teardown_request(response):在每次请求后运行,即使有未处理的异常抛出。
使用举例: @app.before_first_request
7.12 Flask-Script扩展命令行:
安装Flask-Script:pip install Flask-Script
使用:
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
manager = Manager(app)
@app.route('/')
def index():
return '床前明月光'
if __name__ == "__main__":
manager.run() ...
7.13 Jinja2模板:
7.13.1模板的使用示例:
@app.route("/")
def index():
returnrender_template("index.html", name="python")
7.13.2模板前端使用的过滤器:
safe:禁用转义;
<p>{{ '<em>hello</em>' | safe }}</p>
capitalize:把变量值的首字母转成大写,其余字母转小写;
<p>{{ 'hello' | capitalize }}</p>
lower:把值转成小写;
<p>{{ 'HELLO' | lower }}</p>
upper:把值转成大写;
<p>{{ 'hello' | upper }}</p>
title:把值中的每个单词的首字母都转成大写;
<p>{{ 'hello' | title }}</p>
trim:把值的首尾空格去掉;
<p>{{ ' hello world ' | trim }}</p>
reverse:字符串反转;
<p>{{ 'olleh' | reverse }}</p>
format:格式化输出;
<p>{{ '%s is %d' | format('name',17) }}</p>
striptags:渲染之前把值中所有的HTML标签都删掉;
<p>{{ '<em>hello</em>' | striptags }}</p>
链式过滤器(使用两个过滤器):
<p>{{ “ hello world “ | trim | upper }}</p>
列表过滤器:
first:取第一个元素
<p>{{ [1,2,3,4,5,6] | first }}</p>
last:取最后一个元素
<p>{{ [1,2,3,4,5,6] | last }}</p>
length:获取列表长度
<p>{{ [1,2,3,4,5,6] | length }}</p>
sum:列表求和
<p>{{ [1,2,3,4,5,6] | sum }}</p>
sort:列表排序
<p>{{ [6,2,3,1,5,4] | sort }}</p>
自定义过滤器:
注意:自定义的过滤器名称如果和内置的过滤器重名,会覆盖内置的过滤器。
使用举例:
@app.template_filter('db3') #db3为模板中使用的装饰器名字
def filter_double_sort(ls):
return ls[::-3]
7.14 使用Flask-WTF实现表单:
7.14.1视图函数使用示例:
#导入wtf扩展的表单类
from flask_wtf import FlaskForm
#导入自定义表单需要的字段
from wtforms import SubmitField,StringField,PasswordField
#导入wtf扩展提供的表单验证器
from wtforms.validators import DataRequired,EqualTo
app = Flask(__name__) #创建app
app.config['SECRET_KEY']='1' #该模块需要设置 SECRET_KEY 的配置参数
# 定义表单的模型类
classRegisterForm(FlaskForm):
"""自定义的注册表单模型类"""
# 名字 验证器/验证器
# DataRequired 保证数据必须填写,并且不能为空
user_name = StringField(label=u"用户名",validators=[DataRequired(u"用户名不能为空")])
password = PasswordField(label=u"密码",validators=[DataRequired(u"密码不能为空")])
password2 = PasswordField(label=u"确认密码",validators=[DataRequired(u"确认密码不能为空"),
EqualTo("password",u"两次密码不一致")])
submit = SubmitField(label=u"提交")
@app.route("/register",methods=["GET","POST"])
defregister():
# 创建表单对象, 如果是post请求,前端发送了数据,flask会把数据在构造form对象的时候,存放到对象中
form = RegisterForm()
# 判断form中的数据是否合理
# 如果form中的数据完全满足所有的验证器,则返回真,否则返回假
ifform.validate_on_submit():
# 表示验证合格
# 提取数据
uname = form.user_name.data
returnrender_template("register.html",form=form)
7.14.2模板html文件中使用示例:
<formmethod="post">
{{ form.csrf_token }} #先使用表单的csrf验证
{{ form.user_name.label }} #获取表单对象的label的值
<p>{{form.user_name}}</p>
{% for msg in form.user_name.errors %} #循环获取表单校验的错误信息
<p>{{msg}}</p>
{% endfor %}
</form>
7.15 宏:类似于python中的函数,宏的作用就是在模板中重复利用代码,避免代码冗余。
7.15.1宏的定义:
{% macroinput(name,value='',type='text',size=20) %}
<input type="{{ type }}"
name="{{ name }}"
value="{{ value }}"
size="{{ size }}"/>
{% endmacro %}
7.15.2宏的使用:
{{input(value='name',type='password',size=40)}}
7.15.3导入其他模板的宏:
{% import 'macro.html' as func %}
{% func.input() %}