• Flask开发vip版HttpServer #华为云·寻找黑马程序员#


    python HttpServer
    python2与python3都可以基于SimpleHTTPServer,快速创建一个http服务器,但方法略有不同。
    首先进入你需要设置的http服务器目录 (我以自己电脑路径:F:/Working~Study) ,即进入到该目录下,然后:

    python2: python -m SimpleHTTPServer 8888
    python3: python -m http.server 8888

    pythonèªå¸¦httpserver.gif

    使用方式与样式都是一样的,如下图:
    用起来没问题,但丑出天际…
    提单时间到,来说一说有哪些存在的问题吧:

    1. 启动服务器后,无登陆限制,任何人都能访问
    2. 访问链接后,显示纯html页面,美观性差,或者说毫无美感可言
    3. 非ansi码的文本打开,都是乱码
    4. 文本与pdf等文件点击时,默认打开而非下载
    5. 文件夹与文件的差别仅仅在于是否有末尾/,识别度差
    6. 文件夹与文件的详细信息无法获取(如:创建时间,大小)
    7. 页面点击无返回按钮,只能使用浏览器默认的前进后退
    8. 既然python自带的http服务器,存在这么多的问题,那决不能惯着它,今天咱们就自己重写一个PythonHttpServer。

    FlaskHttpServer效果展示

    先来看看最终的实现效果:

    FlaskHttpServer.gif

    • 安全

    添加了用户名密码的登陆限制(简单写死了用户名密码,可扩展支持数据库读取等方式),这个就不多说了,想了解的可以看之前发布的:
    Flask使用Bootstrap模板并引入Ajax后台完成数据刷新

    • 样式

    引入了bootstrap的表单样式,简洁美观

    • 下载

    设置所有文件均直接下载,解决了之前文本等直接打开、并且乱码的问题

    • 展示
    1. 仿照windows系统,添加了名称、修改时间、文件类型、大小
    2. 优化了文件夹、文件等展示方式,并针对两者进行大小写的模糊排序,
    3. 针对文件大小,优化动态展示B、KB、MB、GB
    • 页面跳转

    增加了首页,与子路径的快捷键访问,每一层的路径均可做为链接进行跳转

    设计方案

    1. 使用蓝图构建项目
      虽然目前仅存在账户管理与页面展示和下载两个模块,但使用蓝图的目的是为了便于扩展,后期有空了还可以实现下上传功能。
      整体目录如下:项ç®ç®å½

    2. 针对目录展示
      获取path后,先获取os.listdir()结果进行排序:
      sorted(os.listdir('.'), key=lambda x: x.lower())
      再将目录分为两个列表(文件夹、文件),并针对类型不同,分别获取不同数据,方法如下:

    class DocumentReader:
        def __init__(self, real_path):
            self.real_path = real_path
    
        def analysis_dir(self):
            dirs = []
            files = []
            os.chdir(self.real_path)
            for name in sorted(os.listdir('.'), key=lambda x: x.lower()):
                _time = time.strftime("%Y/%m/%d %H:%M", time.localtime(os.path.getctime(name)))
                if os.path.isdir(name):
                    dirs.append([name, _time, '文件夹', '-'])
                elif os.path.isfile(name):
                    file_type = os.path.splitext(name)[1]
                    size = self.get_size(os.path.getsize(name))
                    files.append([name, _time, file_type, size])
            return dirs, files
    
        @staticmethod
        def get_size(size):
            if size < 1024:
                return '%d  B' % size
            elif 1024 <= size < 1024 * 1024:
                return '%.2f KB' % (size / 1024)
            elif 1024 * 1024 <= size < 1024 * 1024 * 1024:
                return '%.2f MB' % (size / (1024 * 1024))
            else:
                return '%.2f GB' % (size / (1024 * 1024 * 1024))
    

    3.在app中创建自定义过滤器,将所有路径进行拆分,生成子路径及对应的path进行跳转

        @app.template_filter("split_path")
        def split_path(path):
            path_list = path.split('/')
            path_list = [[path_list[i - 1], '/'.join(path_list[:i])] for i in range(1, len(path_list)+1)]
            return path_list
    

    今天的内容就到这里,如果觉得有帮助,欢迎将文章或者我的公众号【清风Python】分享给更多喜欢python的人。

    来源:华为云社区征文 作者:清风Python

  • 相关阅读:
    jsp常用指令
    jsp中的内置对象(9个)、作用
    collection的框架结构
    java——异常
    Spring的依赖注入(DI)三种方式
    mybatis——动态sql
    spring 中事务的PROPAGATION_REQUIRED,Readonly的解释
    Jquery ajax提交表单几种方法详解
    springmvc注解和参数传递
    springmvc和struts2的区别
  • 原文地址:https://www.cnblogs.com/huaweicloud/p/11861607.html
Copyright © 2020-2023  润新知