python用http.server实现的http服务器

来源:互联网 发布:淘宝卖什么等级快 编辑:程序博客网 时间:2024/06/08 03:10
import osimport shutilfrom io import StringIOfrom pymongo import MongoClient, ASCENDINGfrom urllib.parse import urlsplit, parse_qsfrom http.server import HTTPServer, BaseHTTPRequestHandlerclient = MongoClient()skindb = client.skindbclass 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 skindbfor 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)passdef 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 skindbfor 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()


话说,不用框架的话,写起来还是蛮辛苦的。。。

0 0
原创粉丝点击