Python 中基于路径的路由

Path based routing in Python

我正在尝试编写 python 代码,当我 curl localhost:8000 时 return 输出 json。我只想在 curl localhost:8000/shakespear 时获取值。从当前代码开始,我得到的值是 curl localhost:8000 main.py

#!/usr/bin/env python

from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import urlparse
import json

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        parsed_path = urlparse(self.path)
        self.send_response(200)
        self.end_headers()
        self.wfile.write(json.dumps({
            'myfavourite author name': 'shakespear',
        }).encode())
        return
if __name__ == '__main__':
    server = HTTPServer(('0.0.0.0', 8000), RequestHandler)
    print('Starting server at http://localhost:8000')
    server.serve_forever()

您正在忽略路径并向每个请求发送通用响应。 正如您在 RequestHandler class 中看到的那样,变量 parsed_path 被忽略,路径是什么并不重要,响应是一个常量静态的东西。 您应该更改代码并处理 parsed_path 并对每个请求做出适当的响应并将其放入 self.wfile.write

使用 if 条件检查 parsed.path 是否与您想要的端点相同,即 shakespear

def do_GET(self):
  ...
  if self.path == '/shakespear':
    self.send_response(200)
    #do stuff
    ...

请记住 /path 字符串的一部分。 self.path 使用 urlparse 是不必要的

当您处理需要解析的 url 时使用它。

示例:

如文档中所述,urlparse returns 具有 path 属性的 ParseResult

将 url 传递给 urlparse:

from urllib.parse import urlparse
url = "http://127.0.0.1:8080/shakespear"
parsed = urlparse(url)

此 returns 一个 ParseResult 您可以访问其 path 属性:

print(parsed)
ParseResult(scheme='http', netloc='127.0.0.1:8080', path='/shakespear', 
params='', query='', fragment='')

print(parsed.path)
'/shakespear'