zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Postgresql HStore 插件试用小结
    postgres-xl 安装与部署 【异常处理】ERROR: could not open file (null)/STDIN_***_0 for write, No such file or directory
    GPDB 5.x PSQL Quick Reference
    postgresql 数据库schema 复制
    hive 打印日志
    gp与 pg 查询进程
    jquery table 发送两次请求 解惑
    python 字符串拼接效率打脸帖
    postgresql 日期类型处理实践
    IBM Rational Rose软件下载以及全破解方法
  • 原文地址:https://www.cnblogs.com/huaweicloud/p/11861607.html
Copyright © 2011-2022 走看看