【PythonWeb】Flask

实战


基础 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值