Python学习笔记 - 自制文件分享模块

Python学习笔记 - 自制文件分享模块

想要传输一个东西,用USB不方便,用微信或者QQ的话,一方面是不能传输文件夹,必须要先打包成压缩文件;另一方面是文件太大传不了,干脆自制简单网页模块。

简单版

主要用到Python自带的模块http.server。话不多说,直接上代码。

import sys, os

argv = sys.argv  # del sys
_dir = r'C:\Users\Administrator\Desktop'  # 默认共享的文件夹
port = 8000
try:
    _dir = argv[1]  # 获取命令行参数
    port = argv[2]
finally:
    os.system('python -m http.server -d {} {}'.format(_dir, port)
    # 注:-d参数仅支持Python 3.7及以上版本

乍一看感觉一般般,实际上用一下发现并没有什么用——还不如直接调用python -m http.server
好吧,简单版也就只能做成这个样子。

中级版

中级版稍微好一点,至少不会像简单版那样没用!
中级版要用到一点tkinter,不过是内置的模块。

import tkinter, tkinter.ttk
from tkinter.messagebox import showinfo,showerror

root = tkinter.Tk()  # 主窗口
root.title('Python服务器')  # 标题
root.geometry('600x400')  # 大小
root.resizable(width=False, height=False)

tkinter.Label(master=root, text='文件夹路径:').grid(row=1, column=1)
# 单行输入框
dirBox = tkinter.Entry(master=root, width=30)
dirBox.grid(row=1, column=2)  # 定位控件

tkinter.Label(master=root, text='端口号:').grid(row=2, column=1)
# 数字输入框
portBox = tkinter.ttk.Spinbox(master=root,
                              from_=1024,
                              to=20000,
                              increment=1)
portBox.grid(row=2, column=2)  # 定位控件

# 复选框
htmlChoice = tkinter.Checkbox(master=root, text='使用指定的HTML页面:')
htmlChoice.grid(row=3, column=1)
htmlBox = tkinter.Entry(master=root, width=25)
htmlBox.grid(row=3, column=2)


def service():
    try:
        port = int(portBox.get())
    except ValueError:
        showerror(title='错误', message='端口号必须为整数!')
        return
    
    path = dirBox.get()
    if not os.path.exists(path):
        showerror(title='错误', message='文件夹不存在!')
        return

    if htmlChoice.seletion():
        htmlPath = htmlBox.get()
        if not os.path.isfile(htmlPath):
            showerror(title='错误', message='指定的HTML文件不存在!')
            return
        html = ' {}index.html'.format('\\'.join(htmlPath.split('\\')[:-2]) if htmlPath.split('\\').__len__() - 1 else '')
        if html[0] == '\\':
            html = html[1:]
        with open(htmlPath, 'rb') as file_html:
            file_index = open(html, 'wb')
            file_index.write(file_html.read())
            file_index.close()

    os.popen('python -m http.server -d {} {}'.format(path, html, port))


root.mainloop()  # 窗口持久化

这个稍微好点了,但其实都没用什么实际用途。高级版要好的多,应该能满足完美主义者的要求了。

高级版

高级版要用到第三方模块django。下载很简单,上CMD,命令是pip install djangodjango比较大,如果没有配置pip.ini的话,建议用-i参数指定镜像源,否则很有可能抛出异常: Read timeout
下载好后,就开始吧。注: 可以参考编者的Django详细搭建的文章:请单击此处

搭建Django项目

CMD: django-admin startproject Share
其中Share是项目名称,可自行更改。
完成后,Share目录下有几个文件:
manage.py ------------------ 管理项目
db.split3 -------------------- 数据库(db是database的简称)
Share ---------------------- 与项目同名文件夹
+ ---- settings.py ----------- 设置
---- urls.py -------------- 配置URL
---- views.py ------------- 视图处理,须自行创建这个文件
templates ------------------- 请自行创建文件夹
static ---------------------- 静态资源文件夹,请自行创建。

编写首页

urls.py:

from django.core.wsgi.handler import url
from . import views

urlpatterns = [
    # 默认的admin配置... ,
    url(r'^$', views.homepage),
]

views.py:

from django.shoutcut import render, redirect
from res.models import File


def homepage(request):
    # 获取GET参数, 默认为False
    filename = request.GET.get('file', False)

    if filename:
        return redirect(request, '\static\{}'.format(filename)
    # 因为前面已有return, 因此这里不用else
    return render(request, 'homepage.html', {'data': File.objects.all()})
    # 注: PyCharm不会提示File.objects

settings.py:

import os
# 默认配置...
TIME_ZONE = 'Asia/Shanghai'
LANGUAGE_CODE = 'zh-Hans'
TEMPLATES = {
    'dir': [os.path.join(BASEDIR, 'templates')],
    # ...
}
INSTALLED_APPS = [
    # ... ,
    'res',
]

templates\homepage.html(请自行创建):

<!DOCTYPE HTML>
<!-- 由于只是演示,就没做得美观。
在Django项目中,可以直接使用Django的JavaScript和CSS、XML等。也就是说,不用复制文件,直接浏览器上把admin(后面要说到)的HTML下载下来就可以。 -->
<html>
<head>
    <title>Python文件共享 - 高级版</title>
    <meta charset="UTF-8">
</head>
</body>
<p><h1>Python文件共享<h1> | <a href="/admin">管理员登录</a></p>
<!-- Django内置标签, Django会自动处理。 -->
{% for obj in data %}
    <!-- for循环 -->
    <!-- 使用"实例.属性"格式访问属性 -->
    <p>文件名: {{ obj.name }}. <a href="?file={{ obj.name }}">下载</a></p>
    {% empty %}
        <!-- for循环为空 -->
        <p>无资源</p>
</body>
</html>

CMD: python manage.py startapp res
主要是添加APP(Application)。
res目录下:
res + — models.py ---------- 模型
— admin.py ---------- admin配置
# 其它

res\models.py:

from django.db import models
# db就是database的意思,即数据库


class File(models.Model):
    """这就是一个模型"""
    name = models.CharField(max_length=150)

    class Meta:
        """相关信息"""
        verbose_name = '文件资源'  # 名称(单数)
        verbose_name_plural = '文件资源'  # 名称(复数)

admin是Django内置的网站后台,URL地址是网站首页/admin/
admin.py:

from django.contrib import admin
from . import models


class FileAdmin(admin.ModelAdmin):
    # admin后台显示的项目
    list_display = ('id', 'name')
    # admin后台可搜索的项目
    search_fields = ('name', )


# 注册模型
admin.site.register(models.File, FileAdmin)
# 站点名称
admin.site.title_header = 'Python资源共享平台'

生成迁移文件(必须的),CMD: python manage.py makemigrations
生成数据库,CMD: python manage.py migrate

妙哉!现在启动服务器,CMD: python manage.py runserver localhost:8000
生成一个超级用户,CMD: python manage.py createsuperuser Administrator(密码不会显示出来)
服务器访问: http://localhost:8000/admin/
输入超级用户的用户名和密码,进入后台,依次进入:
首页 > res > 文件资源,然后添加文件资源,name就是文件名(注意是文件名称,不是路径),然后把name名称的文件复制到static目录下即可。
浏览器刷新访问http://localhost:8000/,就有文件资源了。

编者技术有限,如有不足敬请指教!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值