使用 JSON 作为交换格式
处理 JSON 时,请求和响应头的 Content-Type
设置为 application/json
。
from flask import Flask, request, Response
import json
app = Flask(__name__)
@app.route('/json', methods=['POST'])
def my_json():
print request.headers
print request.json
rt = {'info':'hello '+request.json['name']}
# add custom headers
response.headers.add('Server', 'python flask')
return Response(json.dumps(rt), mimetype='application/json')
if __name__ == '__main__':
app.run(debug=True)
模拟客户端请求
import requests, json
user_info = {'name': 'einverne'}
headers = {'content-type': 'application/json'}
r = requests.post("http://127.0.0.1:5000/json", data=json.dumps(user_info), headers=headers)
print r.headers
print r.json()
模拟 RESTful 接口
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world'
@app.route('/user/<username>')
def user(username):
print username
print type(username)
return 'hello world'
@app.route('/user/<username>/friends')
def user_friends(username):
print username
print type(username)
return 'hello world'
if __name__ == '__main__':
app.run(debug=True)
使用内置类型装换
@app.route('/page/<int:num>')
def page(num):
print num
print type(num)
return 'hello world'
自动将 num 转换成 int 类型,目前 Flask 支持的转换有:
类别 | 解释 |
---|---|
string | 任何不带 slash(/) 的字符串 |
int | 整数 |
float | float |
path | 接受 slash(/) |
any | 所有 |
uuid | uuid string |
复杂的用法,比如定义一个范围
@app.route('/page/<int:num1>-<int:num2>')
def page(num1, num2):
print num1
print num2
return 'hello world'
自定义转换器
自定义的转换器是一个继承 werkzeug.routing.BaseConverter
的类,修改 to_python
和 to_url
方法即可。to_python
方法用于将url中的变量转换后供被 @app.route
包装的函数使用,to_url
方法用于 flask.url_for
中的参数转换。
下面是一个示例,将 HelloWorld/index.py
修改如下:
from flask import Flask, url_for
from werkzeug.routing import BaseConverter
class MyIntConverter(BaseConverter):
def __init__(self, url_map):
super(MyIntConverter, self).__init__(url_map)
def to_python(self, value):
return int(value)
def to_url(self, value):
return 'hi'
app = Flask(__name__)
app.url_map.converters['my_int'] = MyIntConverter
@app.route('/page/<my_int:num>')
def page(num):
print num
print url_for('page', num='123')
return 'hello world'
if __name__ == '__main__':
app.run(debug=True)
浏览器访问 http://127.0.0.1:5000/page/123 后,HelloWorld/index.py 的输出信息是:
123
/page/hi
url for
上面例子只能提到的 url_for
方法用于构建URL,他的使用方法如下
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/')
def hello_world():
pass
@app.route('/user/<name>')
def user(name):
pass
@app.route('/page/<int:num>')
def page(num):
pass
@app.route('/test')
def test():
print url_for('hello_world')
print url_for('user', name='einverne')
print url_for('page', num=1, q='hadoop mapreduce 10%3')
print url_for('static', filename='uploads/01.jpg')
return ''
if __name__ == '__main__':
app.run(debug=True)
输出
/
/user/einverne
/page/1?q=hadoop+mapreduce+10%253
/static//uploads/01.jpg
url for 后接方法名