一.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存储方式指定
二.创建一个简单的hello world程序
#导入Flask
from flask import Flask
#创建Flask的应用程序
app= Flask(__name__)
#使用装饰器路由去与视图函数进行关联
@app.route('/')
def index():
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/<user_id>')
def user_info(user_id)
return 'hello %s' % user_id
1.2 路由传递的参数默认当作string处理,也可以指定参数的类型
@app.route('/user/<int:user_id>')
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/<int:user_id>')
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
五.异常捕获
HTTP异常主动抛出
abort方法
abort(500)
#使用装饰器的形式去捕获指定的错误码和异常
@app.errorhandler(404)
def page_not_found(error):
return '咦,页面不见了'
六.请求钩子
为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。
请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
before_first_request:在请求第一个请求前执行
before_request:在每次请求前执行 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
after_request:如果没有抛出错误,在每次请求后执行
teardown_request:在每次请求后执行
七.装饰器路由具体实现
Flask有两大核心:
Werkzeug和Jinja2
- Werkzeug 实现路由,调试和Web服务器网关接口
- Jinja2实现了模板
Werkzeug是一个遵循WSGI协议的python函数库
其内部实现了很多Web框架底层的东西,比如request和response对象;
- 与WSGI规范的兼容;支持Unicode;
- 支持基本的会话管理和签名Cookie;
- 集成URL请求路由等。
Werkzeug库的 routing 模块负责实现 URL 解析。不同的 URL 对应不同的视图函数,routing模块会对请求信息的URL进行解 析,匹配到URL对应的视图函数,执行该函数以此生成一个响应信息。
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
某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地的数据(通常经过加密)。
- Cookie运行原理
- 设置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
- 设置过期时间
@app.route('/cookie')
def set_cookie():
response = make_response('hello world')
response.set_cookie('username', 'itheima', max_age=3600)
return response
- 获取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
- Session运行原理
- session数据的获取
@app.route('/index1')
def index1():
session['username'] = 'laowang'
return redirect(url_for('index'))
@app.route('/')
def index():
return session.get('username')
来源:https://blog.csdn.net/sober333/article/details/80117571