一.Web框架
1.什么是Web框架?
协助开发者快速开发Web应用程序的一套功能代码
2.为什么要用Web框架?
稳定性和可扩展性强
可以降低开发难度,提高开发效率
总结一句话:避免重复造轮子
3.在Python中常用的Web框架有
flask django tornado
4.Flask框架的核心
werkzeug(路由模块)
Jinja2(模板引擎)
5.Flask常用扩展包
Flask-SQLalchemy:操作数据库
Flask-script:插入脚本
Flask-migrate:管理迁移数据库
Flask-Session:Session存储方式指定
二.虚拟环境
1.为什么要搭建虚拟环境?
作用:虚拟环境可以搭建独立的python运行环境,使得单个项目的运行环境与其他项目互不影响
在开发过程中,当需要使用python的某些工具包/框架时需要联网安装
2 .安装Flask框架 flask-0.10.1版本
sudo pip install flask ==0.10.1
3.如何搭建虚拟环境
在python3中,创建虚拟环境
mkvirtualenv -p python3 虚拟环境名字
例如 :
mkvirtualenv -p python3 py3_flask
4.如何使用虚拟环境?
查看虚拟环境的命令
wokon 两次tab键
使用虚拟环境的命令
workon py3_flask
退出虚拟环境
deactivate
删除虚拟环境
rmvirtualenv 虚拟环境名称
查看虚拟环境中安装的包
pip freeze
三.创建一个简单的hello world程序
#导入Flask
from flask import Flask
#创建Flask的应用程序
app= Flask(__name__)return 'hello world!'
if __name__=='__main__'
#运行当前Flask应用程序
app.run()
四.Flask创建时候的参数
第一个参数指代Flask所对应的模板,其实可以决定静态文件从哪个位置开始找
app = Flask(__name__ ,
#static_url_path ='/static' #表示静态文件访问的路径
static_url_path = '/python27'
static_folder ='static' #表示静态文件所存放在目录,默认值是static\
template_folder='template' #表示模板文件存放的目录
)
1.给路由传参示例
1.1有时我们需要将同一类 URL映射到同一个视图函数处理,:比如:使用同一个视图函数来显示不同用户的个人信息
@app.route('/user/
def user_info(user_id)
return 'hello %s' % user_id
1.2路由传递的参数默认当作string处理,也可以指定参数的类型
@app.route('/user/
def user_info(user_id)
return 'hello %s' % user_id
2.请求指定方式
在Flask中,定义一个路由,默认的请求方式为:
GET
OPTIONS(自带)
HEAD(自带)
如果想添加请求方式.那么可以如下指定
@app.route('/demo2',methods=['GET','POST'])
def demo2():
#直接从请求中取到请求方式并返回
return request.method
五.视图常用逻辑
1.返回Json
在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中可以直接使用 jsonify 生成一个 JSON 的响应
@app.route('/demo4')
def demo4():
json_dict = {
"user_id" : 10,
"user_name" : "laowang"
}
return jsonify(json_dict)
2.重定向
2.1重定向到 百度官网
@app.route('/demo5')
def demo5():
return redirect('http://www/baidu.com')
2.2重定向到自己写的视图函数
@app.route('/demo1')
def demo1():
return 'demo1'
#重定向
@app.route('/demo5')
def demo5():
return redirect(url_for('demo1'))
2.3重定向到带有参数的视图函数
在 url_for 函数中传入参数
@app.route('/user/
def user_info(user_id):
return 'hello %d' % user_id
#重定向
@app.route('/demo5')
def demo5():
# 使用 url_for 生成指定视图函数所对应的 url
return redirect(url_for('user_info',user_id=100))
3.返回自定义的状态码
@app.route('/demo6')
def demo6():
return '状态吗为666',666
六.转换器
1.什么叫转换器?
定义url的匹配规则的一个对象
2.正则匹配路由
在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问
具体步骤为:
(1).导入转换器基类:在Flask中,所有的路由的匹配规则都是使用转换器对象进行记录
(2).自定义转换器:自定义类继承于转换器基类
(3).添加转化器到默认的转换器字典中
(4).使用自定义转换器实现自定义匹配规则
3.系统自带转换器
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
七.异常捕获
HTTP异常主动抛出
abort方法
abort(500)
#使用装饰器的形式去捕获指定的错误码和异常
@app.errorhandler(404)
def page_not_found(error):
return '咦,页面不见了'
八.请求钩子
为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。
请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
before_first_request 在请求第一个请求前执行
before_request 在每次请求前执行 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
after_request 如果没有抛出错误,在每次请求后执行
teardown_request 在每次请求后执行
九.装饰器路由具体实现
1.Flask有两大核心:
Werkzeug和Jinja2
-Jinja2实现了模板
2. Werkzeug是一个遵循WSGI协议的python函数库
其内部实现了很多Web框架底层的东西,比如request和response对象;
- 与WSGI规范的兼容;支持Unicode;
- 支持基本的会话管理和签名Cookie;
- 集成URL请求路由等。
3.routing模块内部有:
Rule类 用来构造不同的URL模式的对象,路由URL规则
Map类 存储所有的URL规则和一些配置参数
BaseConverter的子类 负责定义匹配规则
MapAdapter类 负责协调Rule做具体的匹配的工作
十. request
属性 | 说明 | 类型 |
---|---|---|
data | 记录请求的数据,并转换为字符串 | * |
form | 记录请求中的表单数据 | MultiDict |
args | 记录请求中的查询参数 | MultiDict |
cookies | 记录请求中的cookie信息 | Dict |
headers | 记录请求中的报文头 | EnvironHeaders |
method | 记录请求使用的HTTP方法 | GET/POST |
url | 记录请求的URL地址 | string |
files | 记录请求上传的文件 | * |
示例 : 获取上传的图片并保存到本地
@app.route('/', methods=['POST'])
def index():
pic = request.files.get('pic')
pic.save('./static/aaa.png')
return 'index'
十一 .状态保持
因为http 是一种无状态协议,浏览器请求服务器是无状态的。
无状态:
指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
无状态原因:
浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象
实现状态保持主要有两种方式:
在客户端存储信息使用:cookie
在服务器端存储信息使用:session
1.Cookie
某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地的数据(通常经过加密)。
1.1Cookie运行原理
1.2设置cookie
from flask imoprt Flask,make_response
@app.route('/cookie')
def set_cookie():
resp = make_response('this is to set cookie')
resp.set_cookie('username', 'itcast')
return resp
1.3设置过期时间
@app.route('/cookie')
def set_cookie():
response = make_response('hello world')
response.set_cookie('username', 'itheima', max_age=3600)
return response
1.4获取cookie
from flask import Flask,request
#获取cookie
@app.route('/request')
def resp_cookie():
resp = request.cookies.get('username')
return resp
2.Session
对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息
在服务端进行状态保持的方案就是Session
Session依赖于Cookie
2.1Session运行原理
2.2session数据的获取
@app.route('/index1')
def index1():
session['username'] = 'laowang'
return redirect(url_for('index'))
@app.route('/')
def index():
return session.get('username')
十二.上下文
current_app
g变量
两者区别:
请求上下文:保存了客户端和服务器交互的数据
应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等
十三.Flask-Script
通过使用Flask-Script扩展,我们可以在Flask服务器启动的时候,通过命令行的方式传入参数。而不仅仅通过app.run()方法中传参,比如我们可以通过:
python hello.py runserver -host ip地址
代码实现
安装 Flask-Script扩展
pip install flask-script
集成 Flask-Script
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
# 把 Manager 类和应用程序实例进行关联
manager = Manager(app)
@app.route('/')
def index():
return '床前明月光'
if __name__ == "__main__":
manager.run()
未完待续......