python简易web服务器学习笔记(三)

import sys, os, BaseHTTPServer

#-------------------------------------------------------------------------------

class ServerException(Exception):
    ‘‘‘For internal error reporting.‘‘‘
    pass

#-------------------------------------------------------------------------------

class case_no_file(object):
    ‘‘‘File or directory does not exist.‘‘‘

    def test(self, handler):
        return not os.path.exists(handler.full_path)

    def act(self, handler):
        raise ServerException("‘{0}‘ not found".format(handler.path))

#-------------------------------------------------------------------------------

class case_existing_file(object):
    ‘‘‘File exists.‘‘‘

    def test(self, handler):
        return os.path.isfile(handler.full_path)

    def act(self, handler):
        handler.handle_file(handler.full_path)

#-------------------------------------------------------------------------------

class case_directory_index_file(object):
    ‘‘‘Serve index.html page for a directory.‘‘‘

    def index_path(self, handler):
        return os.path.join(handler.full_path, ‘index.html‘)

    def test(self, handler):
        return os.path.isdir(handler.full_path) and                os.path.isfile(self.index_path(handler))

    def act(self, handler):
        handler.handle_file(self.index_path(handler))

#-------------------------------------------------------------------------------

class case_directory_no_index_file(object):
    ‘‘‘Serve listing for a directory without an index.html page.‘‘‘

    def index_path(self, handler):
        return os.path.join(handler.full_path, ‘index.html‘)

    def test(self, handler):
        return os.path.isdir(handler.full_path) and                not os.path.isfile(self.index_path(handler))

    def act(self, handler):
        handler.list_dir(handler.full_path)

#-------------------------------------------------------------------------------

class case_always_fail(object):
    ‘‘‘Base case if nothing else worked.‘‘‘

    def test(self, handler):
        return True

    def act(self, handler):
        raise ServerException("Unknown object ‘{0}‘".format(handler.path))

#-------------------------------------------------------------------------------

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    ‘‘‘
    If the requested path maps to a file, that file is served.
    If anything goes wrong, an error page is constructed.
    ‘‘‘

    Cases = [case_no_file(),
             case_existing_file(),
             case_directory_index_file(),
             case_directory_no_index_file(),
             case_always_fail()]

    # How to display an error.
    Error_Page = """        <html>
        <body>
        <h1>Error accessing {path}</h1>
        <p>{msg}</p>
        </body>
        </html>
        """

    # How to display a directory listing.
    Listing_Page = ‘‘‘        <html>
        <body>
        <ul>
        {0}
        </ul>
        </body>
        </html>
        ‘‘‘

    # Classify and handle request.
    def do_GET(self):
        try:

            # Figure out what exactly is being requested.
            self.full_path = os.getcwd() + self.path

            # Figure out how to handle it.
            for case in self.Cases:
                if case.test(self):
                    case.act(self)
                    break

        # Handle errors.
        except Exception as msg:
            self.handle_error(msg)

    def handle_file(self, full_path):
        try:
            with open(full_path, ‘rb‘) as reader:
                content = reader.read()
            self.send_content(content)
        except IOError as msg:
            msg = "‘{0}‘ cannot be read: {1}".format(self.path, msg)
            self.handle_error(msg)

    def list_dir(self, full_path):
        try:
            entries = os.listdir(full_path)
            bullets = [‘<li>{0}</li>‘.format(e) for e in entries if not e.startswith(‘.‘)]
            page = self.Listing_Page.format(‘\n‘.join(bullets))
            self.send_content(page)
        except OSError as msg:
            msg = "‘{0}‘ cannot be listed: {1}".format(self.path, msg)
            self.handle_error(msg)

    # Handle unknown objects.
    def handle_error(self, msg):
        content = self.Error_Page.format(path=self.path, msg=msg)
        self.send_content(content, 404)

    # Send actual content.
    def send_content(self, content, status=200):
        self.send_response(status)
        self.send_header("Content-type", "text/html")
        self.send_header("Content-Length", str(len(content)))
        self.end_headers()
        self.wfile.write(content)

#-------------------------------------------------------------------------------

if __name__ == ‘__main__‘:
    serverAddress = (‘‘, 8080)
    server = BaseHTTPServer.HTTPServer(serverAddress, RequestHandler)
    server.serve_forever()

这次的任务是在路径代表目录而不是文件时展示目录内容列表。
如何处理一个url(统一资源定位符)呢?这次我们先定义了一个类列表,以后可以将各个可能用到的处理方法放入列表中省去了在源码中加if,增强了代码的复用性

然后依然是三种上节中有的情况:existing_file,no_file,always_fail

然后我们做出修改:添加类case_directory_index_file,在请求"index.html"时返回"index.html",case_directory_no_index在不存在时返回目录列表

 

python编程时,经常和文件、目录打交道,这是就离不了os模块。os模块包含普遍的操作系统功能,与具体的平台无关。以下列举常用的命令

(引用自http://www.cnblogs.com/kaituorensheng/archive/2013/03/18/2965766.html)

1. os.name()——判断现在正在实用的平台,Windows 返回 ‘nt‘; Linux 返回’posix‘

2. os.getcwd()——得到当前工作的目录。

3. os.listdir()——指定所有目录下所有的文件和目录名。例:

  以列表的形式全部列举出来,其中没有区分目录和文件。

4. os.remove()——删除指定文件

5. os.rmdir()——删除指定目录

6. os.mkdir()——创建目录

  注意:这样只能建立一层,要想递归建立可用:os.makedirs()

7. os.path.isfile()——判断指定对象是否为文件。是返回True,否则False

8. os.path.isdir()——判断指定对象是否为目录。是True,否则False。例:          9. os.path.exists()——检验指定的对象是否存在。是True,否则False.例:

10. os.path.split()——返回路径的目录和文件名。例:

此处只是把前后两部分分开而已。就是找最后一个‘/‘。看例子:

11. os.getcwd()——获得当前工作的目录(get current work dir)

12. os.system()——执行shell命令。例:

注意:此处运行shell命令时,如果要调用python之前的变量,可以用如下方式:

var=123
os.environ[‘var‘]=str(var) //注意此处[]内得是 “字符串”
os.system(‘echo $var‘)

13. os.chdir()——改变目录到指定目录

14. os.path.getsize()——获得文件的大小,如果为目录,返回0

15. os.path.abspath()——获得绝对路径。例:

16. os.path.join(path, name)——连接目录和文件名。例:

17.os.path.basename(path)——返回文件名

18. os.path.dirname(path)——返回文件路径

__name__就是如果是直接运行的这个代码__name__就是__main__啦

嘛。。话说,这并没有教会服务器智能给出目录结构啊啊,这只是改了一下类的结构然后加了个特判进去啊啊。。确定没有逗我?

代码来源:500 lines or less

时间: 2024-12-04 13:53:24

python简易web服务器学习笔记(三)的相关文章

python简易web服务器学习笔记(二)

import BaseHTTPServer #------------------------------------------------------------------------------- class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): '''Respond to HTTP requests with info about the request.''' # Template for page to sen

python web 服务器学习笔记(四)

在开始新内容之前,我们先解决socket error 98:Address already in use问题 很容易发现可能是由于端口被占用导致的,端口被占用又有很多可能,比如说的关闭你挂上去的服务器,然后又秒开,你会发现这个错误. 此时似乎是由于tcp本身的特性,端口未来得及释放导致的 我们可以通过以下命令查看端口的使用情况,并试着处理它 kill -9 [进程id] 杀死该进程 lsof -i:[端口号]查看端口属于哪个程序 netstrat tln | grep [端口号]查看端口使用情况

Kestrel Web 服务器学习笔记

前言: ASP.NET Core 已经不是啥新鲜的东西,很多新启的项目都会首选 Core 做开发: 而 Kestrel 可以说是微软推出的唯一真正实现跨平台的 Web 服务器了: Kestrel 利用一个名为 KestrelEngine 的网络引擎实现对请求的监听.接收和响应: Ketrel 之所以具有跨平台的特质,源于 KestrelEngine 是在一个名为 libuv 的跨平台网络库上开发的: Kestrel is a cross-platform web server for ASP.N

WEB前端学习笔记 三

接上一篇,web学习笔记 二,web学习笔记刚刚发出,就发现被其他网站采集了,在此感谢您的采集和转发,但请注明文章出自网知博学. 1.7  开发工具的选择 增强文本编辑器:EditPlus.Notepad++ 特点:比较小.占用系统资源比较少.代码颜色高亮显示.但没有代码自动补功能 IDE:(Integrated Development Environment,集成开发环境).IDE集成开发环境(简称IDE)开发环境就是指在开发软件的时候需要用到的软件.这些软件包括代码编辑器.编译器.调试工具和

JSP实现数据传递(web基础学习笔记三)

get和post的区别: JSP内置对象: 1)out内置对象:out内置对象是在JSP开发过程中使用得最为频繁的对象,然而其使用起来也是最简单的.out对象用于向客户端浏览器输出数                                                         据,out对象常用的方法是:print()或者println()方法,这两个方法用于在页面中打印出字符串信息. 2)request内置对象:request对象,JSP中的request内置对象对应了Ser

python web服务器学习笔记(五) 并发尝试之popen原理探究

使用popen新开进程能实现并发吗?像这样的cgi处理程序 def run_cgi(self,handler): cmd = "python" +handler.full_path child_stdin,child_stdout=os.popen2(cmd) child_stdin.close() data=child_stdout.read() child_stdout.close() handler.send_content(data) 我让它跑 for i in range(1

OpenCV for Python 学习笔记 三

给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left,right: 分别表示四个方向上边界的长度 borderType: 边界的类型 有以下几种: BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd

【web开发学习笔记】Structs2 Action学习笔记(三)action通配符的使用

action学习笔记3-有关于通配符的讨论 使用通配符,将配置量降到最低,不过,一定要遵守"约定优于配置"的原则. 一:前端htm <前端代码html> </head> <body> <a href="<%=context %>/actions/Studentadd">添加学生</a> <a href="<%=context %>/actions/Studentdel

python 学习笔记 三 字典

字典 Python的高效的key/value哈希表结构叫做"dict", dict的内容可以写成一系列的key:value对并放入{ }中, 相当于: dict = {key1:value1, key2:value2, ...}, 一个空的字典就是俩个大括号{ }. 下面是从一个空字典创建字典以及一些关键点: 数字, 字符串和元组可以作为字典的key, value可以是任何类型(包括字典). ## Can build up a dict by starting with the the