教程:在 Python 中实现购物车,使用 Vultr 托管数据库进行 Redis

一、介绍

Redis 服务器是使用最广泛的开源数据库解决方案之一。Redis 将所有数据存储在内存中,以实现低延迟和高吞吐量。这些优势使 Redis 适用于存储繁忙网站的购物车数据,尤其是在旺季。

从电子商务网站下订单时,客户通常会从购物清单中选择商品,然后将商品添加到购物车。在后台,购物车驻留在数据库中。虽然使用关系数据库来处理购物车数据是可行的,但此类数据库可能无法在大量用户的情况下以最佳方式执行,并且它们的缓慢可能会对用户体验产生负面影响。

Redis 具有多种功能,您可以使用它们来加快在网站上添加、删除和显示购物车数据的过程。您可以将 Redis,,, 和命令与 Redis 哈希(字段值对的集合)结合使用,以实现所有购物车功能。hsethincrbyhdelhget

本指南向您展示如何在 Ubuntu 20.04 服务器上使用 Python 和托管 Redis 数据库实现购物车应用程序。

二、准备工作

要遵循本指南:

  • 部署 Ubuntu 20.04 服务器。
  • 创建一个非根sudo用户。
  • 配置托管的 Vultr Redis 数据库。然后,导航到您的 Redis 数据库实例并单击概述选项卡以检索您的数据库连接详细信息。本指南使用以下示例连接详细信息:
    • 用户名default
    • 密码EXAMPLE_PASSWORD
    • 主持人SAMPLE_DB_HOST_STRING.vultrdb.com
    • 端口16752

三、创建中央 Redis 类

在设计 Python 应用程序时,通常为基本函数设置单独的类,以促进代码重用并减少重复。本指南使用一个中央 Redis 类,该类处理从 Redis 服务器添加、删除、删除和列出购物车项目的不同功能。按照以下步骤创建类:

  1. 首先创建一个目录,将你的 Python 源代码与其他 Linux 文件分开。project
    $ mkdir project
    
  2. 切换到新目录。project
    $ cd project
    
  3. 在文本编辑器中打开一个新文件。redis_gateway.py
    $ nano redis_gateway.py
    
  4. 在文件中输入以下信息。将 、 和值替换为托管 Redis 数据库中的正确数据库信息。redis_gateway.pydb_hostdb_portdb_pass
    import redis
    
    
    
    class RedisGateway:
    
    
    
        def __init__(self):
    
    
    
            db_host = 'SAMPLE_DB_HOST_STRING.vultrdb.com'
    
            db_port = 16752
    
            db_pass = 'EXAMPLE_PASSWORD'   
    
    
    
            self.redisClient = redis.Redis(host = db_host, port = db_port, password = db_pass, ssl = 'true')
    
    
    
        def add_to_cart(self, json_payload):
    
    
    
            cart_id = json_payload["cart_id"]
    
            product_name = json_payload["product_name"]
    
            quantity = json_payload["quantity"]
    
    
    
            if self.redisClient.hexists(cart_id , product_name):
    
    
    
                self.redisClient.hincrby(cart_id , product_name, quantity)
    
    
    
            else:   
    
    
    
                self.redisClient.hset(cart_id, product_name, quantity)                   
    
    
    
            return "Item added to cart successfully."
    
    
    
        def remove_from_cart(self, json_payload):
    
    
    
            cart_id = json_payload["cart_id"]
    
            product_name = json_payload["product_name"]
    
    
    
    
    
            if self.redisClient.hexists(cart_id, product_name):
    
    
    
                self.redisClient.hdel(cart_id, product_name)
    
    
    
                return "Item removed from cart."
    
    
    
            else:   
    
    
    
                return "Item not found from cart."
    
    
    
        def get_cart(self, cart_id):
    
    
    
            result = self.redisClient.hgetall(cart_id)        
    
    
    
            return result
    
  5. 保存并关闭文件。redis_gateway.py

3.1、redis_gateway.py文件解释

  • 该文件有一个类。redis_gateway.pyRedisGateway
  • 该类有四种方法。RedisGateway
    1. 该函数在首次导入和初始化类时触发。__init__()
    2. 该函数包含您要添加到购物车的、该和该。在函数下,您首先通过运行函数来检查 Redis 服务器中是否存在购物车。如果购物车存在,则使用命令将新数量添加到购物车。否则,如果具有定义的购物车不存在,则从头开始创建它。然后,您将使用该命令添加新的产品名称和数量。add_to_cart(..., json_payload)json_payloadcart_idproduct_namequantityadd_to_cart()self.redisClient.hexistsself.redisClient.hincrby...cart_idself.redisClient.hset(cart_id, product_name, quantity)
    3. 该函数接受具有要从购物车中删除的产品名称的 JSON 有效负载。在发出命令之前,您使用逻辑语句检查产品是否存在于 Redis 服务器中。remove_from_cart(self, json_payload)if self.redisClient.hexists(cart_id, product_name):self.redisClient.hdel(cart_id, product_name)
    4. 该函数采用并查询 Redis 服务器以使用命令列出购物车中的所有项目。get_cart(..., cart_id)cart_idself.redisClient.hgetall(cart_id)
  • 现在准备好了。您可以在其他源代码文件中引用它,并使用以下语法使用其方法:RedisGateway
    import redis_gateway  
    
    rg = redis_gateway.RedisGateway()
    
    
    
    resp = rg.add_to_cart(json_payload);
    
    resp = rg.remove_from_cart(json_payload);
    
    resp = rg.get_cart(cart_id);
    

准备好中央 Redis 网关后,按照下一步为您的应用程序创建主文件。

四、 创建主 Python 文件

每个 Python 应用程序都必须有一个在启动应用程序时触发的主文件。本指南使用文件作为起点。按照以下步骤创建文件:main.py

  1. 在文本编辑器中打开一个新文件。main.py
    $ nano main.py
    
  2. 在文件中输入以下信息。main.py
    import http.server
    
    from http import HTTPStatus
    
    from urllib.parse import urlparse, parse_qs
    
    
    
    import socketserver
    
    import json
    
    
    
    import redis_gateway        
    
    
    
    class httpHandler(http.server.SimpleHTTPRequestHandler):
    
    
    
        def do_POST(self):
    
    
    
            content_length = int(self.headers['Content-Length'])
    
            post_data = self.rfile.read(content_length)
    
    
    
            json_payload = json.loads(post_data) 
    
    
    
            self.send_response(HTTPStatus.OK)
    
            self.end_headers()
    
    
    
            rg = redis_gateway.RedisGateway()
    
    
    
            resp = rg.add_to_cart(json_payload);                
    
    
    
            self.wfile.write(bytes(resp + '\r\n', "utf8"))
    
    
    
        def do_DELETE(self):
    
    
    
            content_length = int(self.headers['Content-Length'])
    
            post_data = self.rfile.read(content_length)
    
    
    
            json_payload = json.loads(post_data) 
    
    
    
            self.send_response(HTTPStatus.OK)
    
            self.end_headers()
    
    
    
            rg = redis_gateway.RedisGateway()
    
    
    
            resp = rg.remove_from_cart(json_payload);                
    
    
    
            self.wfile.write(bytes(resp + '\r\n', "utf8"))
    
    
    
        def do_GET(self):
    
    
    
            self.send_response(HTTPStatus.OK)
    
            self.end_headers()
    
    
    
            parsed_url = urlparse(self.path)
    
            params = parse_qs(parsed_url.query)
    
    
    
            cart_id = params['cart_id'][0]
    
    
    
            rg = redis_gateway.RedisGateway()  
    
    
    
            cart = rg.get_cart(cart_id)
    
    
    
            data = { y.decode('ascii'): cart.get(y).decode('ascii') for y in cart.keys() }
    
    
    
            resp = json.dumps(data, indent = 4, separators = (',', ': '))    
    
    
    
            self.wfile.write(bytes(resp + "\r\n", "utf8"))
    
    
    
    httpServer = socketserver.TCPServer(('', 8080), httpHandler)
    
    
    
    print("HTTP server started at port 8080...")
    
    
    
    try:
    
    
    
        httpServer.serve_forever()
    
    
    
    except KeyboardInterrupt:
    
    
    
        httpServer.server_close()
    
        print("The server is stopped.")
    
  3. 保存并关闭文件。main.py

4.1、main.py 文件解释

  • 该部分允许您导入应用程序所需的所有必要的 Python 模块。,,,, 和模块为应用程序提供 HTTP 功能。该模块允许您在标准 JSON 响应中格式化响应。然后,要连接到 Redis 服务器,您需要导入自定义模块。import ...http.serverHTTPStatusurlparseparse_qssocketserverjsonredis_gateway
  • 该类处理所有 HTTP 方法。这些是,,,和。这些方法与以下购物车功能匹配。httpHandlerPOSTDELETEGET
    • POST:.将商品添加到购物车。rg.add_to_cart(...)
    • DELETE:.从购物车中删除商品。rg.remove_from_cart(...)
    • GET:.列出购物车中的所有商品。rg.get_cart(...)
  • 该语句在端口上启动 HTTP 服务器并声明为处理程序类。httpServer = socketserver.TCPServer(('', 8080), httpHandler)8080httpHandler

您的应用程序现已准备就绪。按照下一步测试应用程序。

五、 测试 Redis 购物车应用程序

最后一步是安装应用程序所需的第三方 Python 模块,并运行一些测试以确保一切正常。

  1. 安装 Python 包。这是一个用于下载和安装Python模块的工具。pip
    $ sudo apt update
    
    $ sudo apt install -y python3-pip
    
  2. 使用软件包来安装 Python 模块。pipredis
    $ pip install redis
    
  3. 使用命令运行应用程序,然后使用启动文件。python3main.py
    $ python3 main.py
    

    输出。

    HTTP server started at port 8080...
    
  4. 与服务器建立另一个 SSH 连接,并使用 Linux命令向应用程序发送以下请求。curl
    • 将三个项目添加到购物车使用。abccart_id
      $ curl -X POST http://localhost:8080/ -H 'Content-Type: application/json' -d '{"cart_id": "abc", "product_name": "SMART WATCH", "quantity": "4"}'
      
      
      
      $ curl -X POST http://localhost:8080/ -H 'Content-Type: application/json' -d '{"cart_id": "abc", "product_name": "4G WIRELESS ROUTER", "quantity": "7"}'
      
      
      
      $ curl -X POST http://localhost:8080/ -H 'Content-Type: application/json' -d '{"cart_id": "abc", "product_name": "500W JUICER", "quantity": "2"}'
      

      输出。

      ...
      
      Item added to cart successfully.
      
    • 从购物车中检索商品。
      $ curl -X GET 'http://localhost:8080?cart_id=abc'
      

      输出。

      {
      
          "SMART WATCH": "4",
      
          "4G WIRELESS ROUTER": "7",
      
          "500W JUICER": "2"
      
      }
      
    • 从购物车中取出一件商品。
      $ curl -X DELETE http://localhost:8080/ -H 'Content-Type: application/json' -d '{"cart_id": "abc", "product_name": "SMART WATCH"}'
      

      输出。

      Item removed from cart.
      

 六、结论

本指南在 Ubuntu 20.04 服务器上使用 Python 和来自 Vultr 的托管 Redis 数据库实现了购物车解决方案。在创建下一个购物车应用程序时,请使用本指南中的示例源代码。Redis 购物车实现允许您的应用程序在高峰期处理许多订单,从而增强用户体验。

赞(0)
未经允许不得转载:主机百科 » 教程:在 Python 中实现购物车,使用 Vultr 托管数据库进行 Redis