eagle 发表于 2015-12-2 11:48:47

利用python BaseHTTPServer 开发的图片浏览小工具

  最近从网上爬了点图片,为了方便浏览就写了这么个小工具。直接上码,解释偏少,代码没有优化,实现比较简略。仅作记录之用。
  1.httpd.py



1 # encoding: UTF-8
2 #-*-coding:utf-8-*-
3 import BaseHTTPServer
4 import config
5 import urllib
6 from CreatHtml import CreateHtmlClass
7 import os
8
9 #登录页面代码,做个简单的访问权限控制
10 login_html ='''<html>
11 <title>Directory listing for </title>
12 <body>
13 <center>
14 <h2> login</h2>
15 <hr>
16   <form action="/login" method="post">
17   <p>UserName: <input type="text" name="une" /></p>
18   <p>PassWord: <input type="password" name="pwd" /></p>
19   <input type="submit" value="Login" />
20   </form>
21 <hr>
22 </center>
23 </body>
24 </html>'''
25
26
27 ct_obj = CreateHtmlClass()
28
29 class EasyWebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
30   def do_GET(self):
31         #if self.path == '/':
32         print self.client_address
33         #print self.headers
34         if self.headers.has_key("Cookie"):
35             print self.headers["Cookie"]
36             err_code,content_type,content = ct_obj.root_html(self.path)
37             self.send_response(err_code)
38             self.send_header("Content-type", content_type)
39             self.send_header("Content-Length", str(len(content)))
40             self.end_headers()
41             self.wfile.write(content)
42         else:
43             print "not login"
44             self.send_response(200)
45             self.send_header("Content-type", "text/html; charset=utf-8")
46             self.send_header("Content-Length", str(len(login_html)))
47             self.end_headers()
48             self.wfile.write(login_html)
49
50   def do_POST(self):
51         print self.path
52         if self.path == "/login":
53             datas = self.rfile.read(int(self.headers['content-length']))
54             datas = urllib.unquote(datas).decode("utf-8", 'ignore')
55             #datas = transDicts(datas)
56             if datas == "une=xxx&pwd=xxx":
57               err_code,content_type,content = ct_obj.root_html("/")
58               self.send_response(err_code)
59               self.send_header("Content-type", content_type)
60               self.send_header("Content-Length", str(len(content)))
61               self.send_header("Set-Cookie","JSESSIONID=JIGUGUJICHACHACHA;Path=/")
62               self.end_headers()
63               self.wfile.write(content)
64         else:
65             self.send_response(404)
66             self.send_header("Content-type", "text/html; charset=utf-8")
67             self.send_header("Content-Length", 3)
68             self.end_headers()
69             self.wfile.write("404")
70         
71
72
73 server = BaseHTTPServer.HTTPServer(('',18080),EasyWebRequestHandler)
74 print 'EasyWebServer start...'
75 server.serve_forever()
  2. CreatHtml.py
  



1 # encoding: UTF-8
2 #-*-coding:utf-8-*-
3 import os
4 import config
5 from PIL import Image
6
7
8 image_dic = {
9   'png':'image/png',
10   'jpg':'image/jpeg',
11   'jpeg':'image/jpeg',
12   'bmp':'image/bmp',
13 }
14
15 class CreateHtmlClass:
16   """docstring for CreateHtml"""
17   def __init__(self):
18         self.root = config.root
19
20 #    def check_image(self,path):
21 #      type_pos = path.rfind('.')
22 #      type_str = path
23 #      if not image_dic.has_key( type_str.lower() ):
24 #            return False,0
25 #
26 #      im = Image.open(path)
27 #      width = im.size
28 #      height = im.size
29 #      ratio = width/1400.0
30 #      ifratio > 1.0 :
31 #            return True,str(int(height/ratio))
32 #      else:
33 #            return False,1
34   def check_image(self,path):
35         type_pos = path.rfind('.')
36         type_str = path
37         if not image_dic.has_key( type_str.lower() ):
38             return False,0
39         try:
40             im = Image.open(path)
41             width = im.size
42             height = im.size
43             ratio = width/1400.0
44             ifratio > 1.0 :
45               return True,str(int(height/ratio))
46             else:
47               return False,1
48         except Exception, e:
49             print e
50             return False,1
51         
52   def creat_dir_html(self,path):
53         if path == '/':
54             path = ""
55         local_path = self.root + path
56         content = ""
57         local_path_about = local_path + '/about.info'
58         if os.path.exists(local_path_about):
59             f = open(local_path_about,'r')
60             h2 = f.readline()
61             f.close()
62
63             content = '<title>Directory listing for '+ h2+'</title><body><center><h2>'+ h2 +'</h2><hr><ul>'
64             for f in os.listdir(local_path):
65               if str(f) != 'about.info':
66                     is_image,height = self.check_image(local_path + '/' + str(f))
67                     if is_image:
68                         content += '<li><img src="' + path + '/' + str(f) + '" alt="' + str(f) + '" width="1400" height="'+ height +'"/></li><br/><br/>'
69                     elif height == 1:
70                         content += '<li><img src="' + path + '/' + str(f) + '" alt="' + str(f) + '" /></li><br/><br/>'
71             content += '</ul></center><hr></body></html>'
72         else:
73             content = '<title>Directory listing for '+ path+'</title><body><h2>'+ path +' /</h2><hr><ul>'
74             for f in os.listdir(local_path):
75               content += '<li><a href="' + path + '/' + str(f) + '">' + str(f) + '</a></li>'
76             content += '</ul><hr></body></html>'
77         return content
78
79   def read_local_file(self,path):
80         f = open(path,'rb')
81         read = f.read()
82         f.close()
83         #print path
84         return read
85
86   def write_local_file(self,path,content):
87         f = open(path,'w')
88         f.write(content)
89         f.close()
90
91   def get_dir_html(self,path,refresh_pos):
92         content = None
93         content_type = None
94         error_code = 200
95         local_path = self.root + path
96         path_name_pos = path.rfind('/')
97         path_name = path
98         local_path_html = local_path + '/'+path_name+'.html'
99         print local_path_html
100         content_type = "text/html; charset=utf-8"
101         if path == '/' :
102             content = self.creat_dir_html(path)
103         elif refresh_pos == -1 and os.path.exists(local_path_html):
104             content = self.read_local_file(local_path_html)
105         else:
106             content = self.creat_dir_html(path)
107             self.write_local_file(local_path_html,content)
108
109         return error_code,content_type,content
110
111   def get_404_html(self):
112         content = "404"
113         error_code = 404
114         content_type = "text/html; charset=utf-8"
115         return error_code,content_type,content
116
117   def get_file_content(self,path):
118         if path=='/':
119             path = ""
120         local_path = self.root + path
121         type_pos = path.rfind('.')
122         type_str = path
123         content_type = "*/*"
124         print type_str
125         error_code = 200
126         if image_dic.has_key(type_str.lower()):
127             content_type = image_dic
128
129         if os.path.exists(local_path):
130             content = self.read_local_file(local_path)
131         else:
132             return self.get_404_html()
133         return error_code,content_type,content
134
135   def root_html(self,path):
136         refresh_pos = path.find('refresh')
137         if refresh_pos != -1:
138             path = path
139         content = None
140         content_type = None
141         error_code = None
142         local_path = self.root + path
143
144         
145         if os.path.isdir(local_path):
146             error_code,content_type,content = self.get_dir_html(path,refresh_pos)
147         else:
148             error_code,content_type,content = self.get_file_content(path)
149
150         return error_code,content_type,content
  3.config.py



1 # encoding: UTF-8
2 #-*-coding:utf-8-*-
3 root="E:/"
  
  使用细节:
  1.注意在存放图片文件夹内新建一个about.info 的文件,内部填写的是图片简介(utf-8)编码保存
页: [1]
查看完整版本: 利用python BaseHTTPServer 开发的图片浏览小工具