flask简单认识
安装虚拟环境
sudo pip3 install virtualenv
安装虚拟环境扩展包
sudo pip3 install virtualenvwrapper
创建python3虚拟环境
mkvirtualenv -p python3 Flask_py3
指定Flask版本安装
$ pip install flask==0.10.1
pip freeze > requirements.txt
Mac系统
easy_install flask==0.10.1
在ipython中测试安装是否成功
from flask import Flask
Python 项目中必须包含一个 requirements.txt 文件,用于记录所有依赖包及其精确的版本号,以便在新环境中进行部署操作。
当需要创建这个虚拟环境的完全副本,可以创建一个新的虚拟环境,并在其上运行以下命令:
pip install -r requirements.txt
使用 methods 参数指定可接受的请求方式,可以是多种
@app.route('/',methods=['GET'])
def hello():
return '<h1>hello world</h1>'
同一路由指向两个不同的函数,在匹配过程中,至上而下依次匹配,
@app.route('/')
def hello():
return '<h1>hello world</h1>'
@app.route('/')
def hello_2017():
return '<h1>hello 2017</h1>'
有时我们需要将同一类URL映射到同一个视图函数处理,比如:使用同一个视图函数 来显示不同用户的个人信息。
路由传递的参数默认当做string处理,这里指定int,尖括号中的内容是动态的,也可不指定类型.
@app.route('/user/<int:id>')
def hello_world(id):
return 'hello world %d' %id
重定向redirect示例:
from flask import redirect
@app.route('/')
def hello_world():
return redirect('https://www.baidu.com')
在 Python 中返回状态码有两种方式实现:
- 直接return
- 可以自定义返回状态码,可以实现不符合http协议的状态码,例如:error=666,errmsg=’查询数据库异常’,其作用是为了实现前后端数据交互的方便
- abort方法
- 只会抛出符合http 协议的异常状态码,用于手动抛出异常
@app.route('/')
def hello_world():
return 'hello world',666
在web开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,限制访问,优化访问
导入转换器包
from werkzeug.routing import BaseConverter
自定义转换器包
# 自定义转换器
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_world(id):
return 'hello %s'%id
捕获异常
abort方法
抛出一个给定状态代码的 HTTPException,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。
参数: code – HTTP的错误状态码
@app.route('/abort')
def demo1():
abort(404)
#只能抛出HTTP协议的状态码
return 'hello'
@app.errorhandler(404)
def demo2(e):
return 'hello'
errorhandler装饰器
注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰器的方法
-
参数:code_or_exception – HTTP的错误状态码或指定异常
-
例如统一处理状态码为500的错误给用户友好的提示:
@app.errorhandler(500)
def internal_server_error(e):
return '服务器搬家了'
开启调试模式
可以实现不用重启服务器就能实现当前代码更新时自动上传
1、创建一个.cfg文件内容为:DEBUG=True
app.config.from_pyfile('文件名')
2、if __name__ = '__main__'
app.run(debug = True)
3、class MyConfig(object):
DEBUG=True
app.config.from_object(MyConfig)
4、app.config['DEBUG']=True
装饰器路由的实现
-
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类(负责具体URL匹配的工作)
url_for
from flask import Flask,url_for,redirect
......
@app.route('/',methods=['GET','POST'])
def hello_world():
return 'Hello World!%s'%request.method
@app.route('/',methods=['GET','POST'])
def hello():
return 'Hello!'
@app.route('/order,methods=['GET','POST'])
def demo3(order_id):
return redirect(url_for('hello'))
在此首先访问’/order’,通过url_for找到’hello’函数的url,为’/’,然后找符合此url的视图函数,至上而下依次匹配原则,则运行’hello_world’视图函数。
返回Json
from flask import json,jsonify
---
@app.route('/json',methods=['GET','POST'])
def demo4():
json_dict = {
'wxx':123,
'kjk':678,
}
return json.dumps(json_dict)
返回:{"kjk": 678, "wxx": 123}
Content-Type:text/html
--------------------------------------------
@app.route('/json',methods=['GET','POST'])
def demo4():
json_dict = {
'wxx':123,
'kjk':678,
}
return jsonify(json_dict)
返回:{
"kjk": 678,
"wxx": 123
}
Content-Type:application/json
request
就是flask中代表当前请求的request对象:
属性 | 说明 | 类型 |
---|---|---|
data | 记录请求的数据,并转换为字符串 | * |
form | 记录请求中的表单数据 | MultiDict |
args | 记录请求中的查询参数 | MultiDict |
cookies | 记录请求中的cookie信息 | Dict |
headers | 记录请求中的报文头 | EnvironHeaders |
method | 记录请求使用的HTTP方法 | GET/POST |
url | 记录请求的URL地址 | string |
files | 记录请求上传的文件 | * |
from flask import request
----
@app.route('/updata',methods=['GET','POST'])
def update():
# 127.0.0.1:5000 / updata ?name = wxx & age = 22
args = request.args
name = args.get('name')
age = args.get('age')
print name,age
pic_file = request.files.get('pic')
pic_file.save('./mm.png')#form-data ,选File模式 上传文件,保存文件
print ('data%s'%request.data)#raw形式 不是键值对
return "upload"