product.py 6.1 KB
from flask import jsonify, request,Response
from app.models import Product
from app.api.auths import Auth
from app import common
from app import db
from app.api import bp
from app.api.errors import bad_request
from app import Config
import random
from werkzeug.utils import secure_filename
from datetime import datetime
import os
# def init_api(app):
@bp.route('/products/', methods=['POST'],strict_slashes=False)
def create_product():
    """
    创建产品
    :return: json
    """
    form = request.form
    data = {}
    for key,value in form.items():
        if value:
            data[key] = value
    # print (data)
    # data = {
    #     "area":float(form.get('area')),
    #     "ipc":float(form.get('ipc')),
    #     "length":float(form.get('length')),
    #     "name":form.get('name'),
    #     "note":form.get('note'),
    #     "width":float(form.get('width')),
    # }
    if Product.query.filter_by(name=form.get('name')).first():
        message = {}
        message['name'] = 'Name is unique'
        return bad_request(message)
    else:
        if request.files.get('file'):
            f = request.files.get('file')
            if allowed_file(f.filename):
                filename = secure_filename(f.filename)
                random_num = random.randint(0,100)
                filename = datetime.now().strftime("%Y%m%d%H%M%S") + "_" + str(random_num) + "." + filename.rsplit('.', 1)[1]
                if not os.path.isdir(Config.SERVER_USER_PRODUCT_UPLOADS):
                    os.makedirs(Config.SERVER_USER_PRODUCT_UPLOADS)
                file_path = os.path.join(Config.SERVER_USER_PRODUCT_UPLOADS, filename)
                f.save(file_path)
            data['img'] = filename
        # data = request.get_json()
        print (data)
        if not data:
            return bad_request('wrong data.')
        message = {}
        if 'name' not in data or not data.get('name'):
            message['name'] = 'Name is required.'
        if message:
            return bad_request(message)
        product = Product()
        product.from_dict(data)
        db.session.add(product)
        db.session.commit()
        response = jsonify(product.to_dict())
        response.status_code = 201
        return response
    # HTTP协议要求201响应包含一个值为新资源URL的Location头部
    # response.headers['Location'] = url_for('api.get_post', id=post.id)

@bp.route('/products/', methods=['GET'])
def get_products():
    '''返回产品集合,分页'''
    page = request.args.get('page', 1, type=int)
    per_page = min(
        request.args.get(
            'per_page', 10, type=int), 100)
    data = Product.to_collection_dict(
        Product.query.order_by(Product.testtime.desc()), page, per_page,
        'api.get_products')
    return jsonify(data)

@bp.route('/products/<int:id>', methods=['GET'])
def get_product(id):
    '''返回一项产品'''
    product = Product.query.get_or_404(id)
    # post.views += 1
    # db.session.add(post)
    # db.session.commit()
    return jsonify(product.to_dict())

@bp.route('/products/<int:id>', methods=['PUT'])
def update_product(id):
    '''修改一项产品'''
    product = Product.query.get_or_404(id)
    form = request.form
    print (form)
    data = {}
    for key,value in form.items():
        if value:
            data[key] = value
    if not data:
        return bad_request('No data.')
    if request.files.get('file'):
        f = request.files.get('file')
        if allowed_file(f.filename):
            filename = secure_filename(f.filename)
            random_num = random.randint(0,100)
            filename = datetime.now().strftime("%Y%m%d%H%M%S") + "_" + str(random_num) + "." + filename.rsplit('.', 1)[1]
            if not os.path.isdir(Config.SERVER_USER_PRODUCT_UPLOADS):
                os.makedirs(Config.SERVER_USER_PRODUCT_UPLOADS)
            file_path = os.path.join(Config.SERVER_USER_PRODUCT_UPLOADS, filename)
            f.save(file_path)
        data['img'] = filename
    product.from_dict(data)
    db.session.commit()
    return jsonify(product.to_dict())
    # product = Product.query.get_or_404(id)
    # data = request.get_json()
    # if not data:
    #     return bad_request('You must post JSON data.')
    # message = {}
    # if message:
    #     return bad_request(message)
    # product.from_dict(data)
    # db.session.commit()
    # return jsonify(product.to_dict())


@bp.route('/products/<int:id>', methods=['DELETE'])
# @token_auth.login_required
def delete_product(id):
    '''删除一项产品'''
    product = Product.query.get_or_404(id)
    db.session.delete(product)
    db.session.commit()
    payload = jsonify({'msg':'success'})
    # return jsonify({'msg':'success'}), 204
    return payload,200
    # return jsonify(common.trueReturn(returnUser, "用户注册成功"))

@bp.route("/upload",methods=['POST'])
def upload():
    f = request.files.get('file')
    id = int(request.form.get('pid'))
    product = Product.query.get_or_404(id)
    if allowed_file(f.filename):
        filename = secure_filename(f.filename)
        random_num = random.randint(0,100)
        filename = datetime.now().strftime("%Y%m%d%H%M%S") + "_" + str(random_num) + "." + filename.rsplit('.', 1)[1]
        if not os.path.isdir(Config.SERVER_USER_PRODUCT_UPLOADS):
            os.makedirs(Config.SERVER_USER_PRODUCT_UPLOADS)
        file_path = os.path.join(Config.SERVER_USER_PRODUCT_UPLOADS, filename)
        f.save(file_path)
        data = {"img":filename}
        product.from_dict(data)
        db.session.commit()
        new_path = "/static/tmp/uploads/" + filename
        data = {"msg": "success",'path':new_path}
        payload = jsonify(data)
        return payload,200

# 查看图片
@bp.route("/photo/<filename>",methods=['GET'])
def get_frame(filename):
  # 图片上传保存的路径
    # path = "/project/ion/static/tmp/uploads/20210407133610_81.jpg"
    with open(r"/project/ion/static/tmp/uploads/{}".format(filename),'rb') as f:
        image = f.read()
        resp = Response(image, mimetype="image/jpg")
    return resp

# 验证图片拓展名
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1] in Config.ALLOWED_EXTENSIONS