import os import shutil from io import StringIO from pymongo import MongoClient, ASCENDING from urllib.parse import urlsplit, parse_qs from http.server import HTTPServer, BaseHTTPRequestHandler client = MongoClient() skindb = client.skindb class SkinHelpRequestHandler(BaseHTTPRequestHandler): def do_GET(self): url = urlsplit(self.path) qs = parse_qs(url.query) print(url.query) print(qs) if url.path == "/": self.showall() elif url.path == "/tag": self.showtag(qs["key"][0]) elif url.path == "/common.css": self.staticfile("common.css") else: self.error_404() def error_404(self): rsp = "Not Found" rsp = rsp.encode("gb2312") self.send_response(404) self.send_header("Content-type", "text/html; charset=gb2312") self.send_header("Content-Length", str(len(rsp))) self.end_headers() self.wfile.write(rsp) def staticfile(self, fname): with open(fname, "rb") as f: self.send_response(200) self.send_header("Content-type", "text/css; charset=gb2312") self.send_header("Content-Length", str(os.path.getsize(fname))) self.end_headers() shutil.copyfileobj(f, self.wfile) def showall(self): rsp = StringIO() rsp.write( """ <html> <head> <title> 皮肤库帮助 </title> </head> <link rel="stylesheet" type="text/css" href="common.css" /> <body>""") rsp.write("<p>所有标记:</p><div class=\"clearfix\">") # 添加所有标记 global skindb for n in skindb.nodes.find({}, {"name":1, "_id":0}).sort("name", ASCENDING): rsp.write("<a href=\"/tag?key=%s\">%s</a><span class=\"tagpadding\">、</span>" % (n["name"], n["name"])) rsp.write("</div><br /><p>所有属性:</p><div class=\"clearfix\">") # 添加所有属性 for n in skindb.attrs.find({}, {"name":1, "_id":0}).sort("name", ASCENDING): rsp.write("<a href=\"/attr?key=%s\">%s</a><span class=\"tagpadding\">、</span>" % (n["name"], n["name"])) rsp.write("</div></body></html>") bytes_rsp = rsp.getvalue().encode("gb2312") self.send_response(200) self.send_header("Content-type", "text/html; charset=gb2312") self.send_header("Content-Length", str(len(bytes_rsp))) self.end_headers() self.wfile.write(bytes_rsp) pass def showtag(self, tag): rsp = StringIO() rsp.write( """ <html> <head> <title> 皮肤库帮助 - 标记:%s </title> </head> <link rel="stylesheet" type="text/css" href="common.css" /> <body>""" % tag) global skindb for n in skindb.nodes.find({"name": tag}, {"_id":0}).sort("name", ASCENDING): rsp.write("<p>标记:%s</p><br/>" % tag) rsp.write("<p>子标记:</p><div class=\"clearfix\">") for k in n["subnodes"]: rsp.write("<a href=\"/tag?key=%s\">%s</a><span class=\"tagpadding\">、</span>" % (k, k)) rsp.write("</div><br /><p>标记属性:</p><div class=\"clearfix\">") for k in n["attrs"]: rsp.write("<a href=\"/attr?key=%s\">%s</a><span class=\"tagpadding\">、</span>" % (k, k)) rsp.write("</div><br /><p>文件:</p>") for k in n["occurs"]: rsp.write("<p class=\"clearfix\"><a href=\"/static/%s\">%s</a></p>" % (k, k)) rsp.write("</body></html>") bytes_rsp = rsp.getvalue().encode("gb2312") self.send_response(200) self.send_header("Content-type", "text/html; charset=gb2312") self.send_header("Content-Length", str(len(bytes_rsp))) self.end_headers() self.wfile.write(bytes_rsp) if __name__ == '__main__': server_address = ('', 52000) httpd = HTTPServer(server_address, SkinHelpRequestHandler) httpd.serve_forever()
话说,不用框架的话,写起来还是蛮辛苦的。。。