import os import subprocess import sys from flask import Flask, request, jsonify from flask_cors import CORS from loguru import logger from config import get_config from services.order import OrderService from services.user import UserService from utils.datetime import parse_time_string, to_milliseconds from utils.proj import filter_empty app = Flask('app') CORS(app, resources={r"/*": {"origins": "http://localhost:8080"}}) config = get_config() config.order.lifetime = to_milliseconds(**parse_time_string(config.order.lifetime)) order_service = OrderService(config) user_service = UserService(config) @app.after_request def add_cors_headers(response): response.headers['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8080' # 具体的来源 # response.headers['Access-Control-Allow-Credentials'] = 'true' # 如果需要凭据支持 response.headers['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS' response.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization' return response @app.route('/createOrder', methods=['POST']) def create_order(): data = request.get_json() name = filter_empty(data.get('name', None)) phone = filter_empty(data.get('phone', None)) email = filter_empty(data.get('email', None)) payment_method = filter_empty(data.get('paymentMethod', None)) if payment_method is None or payment_method not in config['PaymentAddresses']: return jsonify({ "message": "wrong payment method" }), 400 quant = int(data.get('amount', 0)) if quant < config.order.get_int("min_quant"): return jsonify({ "message": "Amount below minimum limit." }), 400 wallet_address = filter_empty(data.get('wallet_address', None)) if wallet_address is None: logger.debug('wallet address not provided') wallet_addresses = user_service.get_wallet_addresses(name, phone, email, payment_method) if not wallet_addresses: logger.debug('wallet address are not found') return jsonify({ "message": "empty wallet address" }), 400 if len(wallet_addresses) > 1: logger.debug('multiple wallet addresses') return jsonify({ "message": "Please select an address to place your order.", "wallet_addresses": wallet_addresses }), 200 # 单个地址 wallet_address = wallet_addresses[0] else: user_service.update_or_create(name, phone, email, wallet_address, payment_method) logger.debug(f'wallet address: {wallet_address}') order_id, create_timestamp = order_service.create_order(name=name, phone=phone, email=email, quant=quant, payment_method=payment_method, wallet_address=wallet_address) return jsonify({"orderID": order_id, "amount": quant, "orderCreateTimestamp": create_timestamp, "orderExpirationTime": config.order.lifetime}), 200 @app.route('/queryOrder', methods=['POST']) def query_order(): data = request.get_json() name = filter_empty(data.get('name', None)) phone = filter_empty(data.get('phone', None)) email = filter_empty(data.get('email', None)) wallet_address = filter_empty(data.get('wallet_address', None)) page = data.get('page', 1) # 获取页码,默认为第 1 页 page_size = data.get('page_size', 10) offset = (page - 1) * page_size limit = page_size orders = order_service.query_order(name, phone, email, wallet_address, offset, limit) return jsonify({"orders": orders}), 200 order_status = config.order.order_status @app.route('/finishOrder', methods=['GET']) def finish_order(): order_id = request.args.get('orderID', None) logger.debug(f"complete oreder: {order_id}") status = order_service.finish_order(order_id) return jsonify({"order_id": order_id, "status": status, "msg": order_status[status]}), 200 def run_gunicorn(): # Gunicorn 的命令和参数 command = [sys.executable, '-m', 'gunicorn', 'app:app'] # 启动 Gunicorn subprocess.run(command) if __name__ == '__main__': if os.name == 'nt': app.run(debug=True, port=5000, host='0.0.0.0') elif os.name == 'posix': run_gunicorn()