实战
基础 Demo
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "Hello, World!"
if __name__ == '__main__':
app.run(debug=True)
如果改成 app.run(host=‘0.0.0.0’) ,则可以允许外网访问;
Get 请求
1、不带参数的请求
from flask import Flask, jsonify
app = Flask(__name__)
products = [
{
'product_id': 1,
'name': 'Nike AirForce',
'price': '899',
},
{
'product_id': 2,
'name': 'Nike AirMax',
'description': '999',
}
]
@app.route('/ezrealer/products/nice', methods=['GET'])
def get_users():
return jsonify({'products': products})
if __name__ == '__main__':
app.run(debug=True)
浏览器访问 http://127.0.0.1:5000/ezrealer/products/nice 即可看到 users 的数据;
也可以在 命令行执行:curl -i http://127.0.0.1:5000/ezrealer/products/nice
2、带参数的请求
from flask import Flask, jsonify
from flask import abort
import time
app = Flask(__name__)
products = [
{
'product_id': 1,
'name': 'Nike AirForce',
'price': '899',
},
{
'product_id': 2,
'name': 'Nike AirMax',
'description': '999',
}
]
@app.route('/ezrealer/products/nice/<int:product_id>', methods=['GET'])
def get_product_by_pid(product_id):
product = list(filter(lambda t: t['product_id'] == product_id, products))
if len(product) == 0:
abort(404)
return jsonify({'product': product[0]})
if __name__ == '__main__':
app.run(debug=True)
此时 访问 http://127.0.0.1:5000/ezrealer/products/nice/1 会获得对应的商品信息;
如果访问呢 http://127.0.0.1:5000/ezrealer/products/nice/3 ,则会跳到一个错误页面;
3、 设定错误提示
from flask import make_response
@app.errorhandler(404)
def not_found(error):
return make_response(jsonify({'error': 'Not found'}), 404)
4、加入mysql 与 redis 连接
方案一:每次请求建立连接,请求完毕再释放连接;
方案二:使用连接池维护一批连接,需要连接的时候从连接池取
显然当请求频繁的时候,方案一性能较差,对数据库也有影响,我们采用方案二;
from flask import Flask, jsonify
from flask import abort
import time
from DBUtils.PooledDB import PooledDB
from flask import make_response
import pymysql
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
pool = PooledDB(
pymysql,
maxconnections = 5,
host="127.0.0.1",
user='root',
password='123456',
database='craw_data',
port=3306,
charset="utf8mb4"
)
rproxy_pool = redis.ConnectionPool(host="127.0.0.1", port=6379, password='123456', decode_responses=True, db=1)
@app.route('/ezrealer/products/nice/<int:product_id>', methods=['GET'])
def get_product_by_pid(product_id):
conn = pool.connection() #以后每次需要数据库连接就是用connection()函数获取连接就好了
cur = conn.cursor()
r_proxy = redis.Redis(connection_pool=rproxy_pool)
if len(product) == 0:
abort(404)
cur.close()
conn.close()
return jsonify({'product': product[0]})
if __name__ == '__main__':
app.run(debug=True)
PS:如需返回数据中文显示正确,加上 app.config[‘JSON_AS_ASCII’] = False 即可;
相关资料
使用 Python 和 Flask 设计 RESTful API:http://www.pythondoc.com/flask-restful/first.html