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

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()


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

你可能感兴趣的:(http,python)