IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 2021-10-17 FLASK下的公共网盘以及私有网盘的写法 -> 正文阅读

[Python知识库]2021-10-17 FLASK下的公共网盘以及私有网盘的写法

FLASK的上传、下载比较简单我,我之前留了博客记录并写了个类似网盘的东西,昨天突然想把网盘搞个验证,于是留下了这篇记录。

因为,我这个已经部署在阿里云服务器上了,所以张贴代码的时候不会进行优化和重构,反正代码这东西既然能用,有时候真的不想仔细看,所以本次主要记录思路和思考点以及注意项,代码码就是意思意思凑合凑合。

首先,网盘建立公有网盘是比较简单的一个HTML,文件名UPLOAD.HTML ,3个路由基本拿下
<html>
<head>
  <title>海的思想个人简易网盘</title>
</head>
<body>
<p><h1>这里是公共网盘</h1></p>


{%if phone_s %}
<p><h1>用户:{{phone_s}}你好</h1></p>
<p><h1><a href="wangpan2/{{phone_s}}">进入私人网盘请点击这里</a></h1></p>
{%else%}
<h1><a href="/login">如需私人网盘,请先登录</a></h1>
{%endif%}
    <form action="/uploader" method="POST" enctype="multipart/form-data">
        <input type="file" name="file" accept=".jpg,.png,.xls,.doc,.xlsx" />
        <input type="submit" />
    </form>
    {%for i in a %}
    <p><a href="/down/{{i}}">{{i}}</a></p>
    {%endfor%}
</body>
</html>

这个HTML页面承载着方面

  1. 通过判断SESSION的手机号内容语句,来决定是否展示私人网盘的地址
  2. 通过get方法的表单提供上传选择按钮
  3. 通过GET方法展示公共目录下的文件(注意:他的路由里边我写了判断是文件夹还是文件的相关逻辑)
  4. 通过POST方法提交文件,这里注意下ACTION 的呼叫路由就行

然后是配套的路由


from flask import Blueprint,redirect,request,render_template,send_file,session,g
import os
wangpan_bp=Blueprint('wanpan',__name__)
@wangpan_bp.before_request #钩子函数钩住验证部分,用个g把是否验证内容传过去。
def session_phone():
    phone = session.get('phone')
    if phone :
        g.phone =phone 
    else:
        g.phone = ''

@wangpan_bp.route('/wangpan') #这是主路由,页面的基础展示页面都在这里
def wangpan():
    a=[]
    for i in os.listdir('./upload/'):
        if os.path.isfile('./upload/'+i):#这里注意:::必须是相对路径才能判断
            a.append(i)
    print(a)#这个a是目录下已经去除了文件夹的文件名集合。
    phone_s=session.get('phone')# 获取登录信息,这里影响页面是否展示个人网盘连接
    return render_template('upload.html',a=a,phone_s=phone_s)

@wangpan_bp.route('/uploader', methods = ['GET', 'POST']) #上传
def uploader():
   if request.method == 'POST':
        f = request.files['file'] #调用方法形成对象 ,f对象可以.filename获取文件名也可以f.save*(保存路径)    执行保存动作
        f.save(r'./upload/%s'%f.filename) #保存路径格式化进去文件名,保存。
        return redirect ('/wangpan')
@wangpan_bp.route('/down/<name>')#下载
def down(name):
    return send_file(r'./upload/%s'%name,as_attachment=True)

下面是私人网盘部分 ,先是HTML文件名UPLOAD2.HTML部分。

<html>
<head>
  <title>海的思想个人简易网盘</title>
</head>
<body>
<p><h1>这里是私人网盘</h1></p>
{%if phone_s %}
<p><h1>用户:{{phone_s}}你好</h1></p>
{%endif%}
    <form action="/uploader2" method="POST" enctype="multipart/form-data">
        <input type="file" name="file" accept=".jpg,.png,.xls,.doc,.xlsx" />
        <input type="submit" />
    </form>
    {%for i in a %}
    <p><a href="/down2/{{i}}">{{i}}</a></p>
    {%endfor%}
</body>
</html>

这个页面很类似,不同在于,按理说能进入私人网盘的人应该是通过了用户验证的,所以用户必然是有账号的,那么,我们获取用户账号,并在该账号的子文件夹内部执行展示文件、上传、下载内容。那么就是把用户特征传过来并把指向写好

下面是代码部分,接着上面的路由代码写的


@wangpan_bp.route('/wangpan2/<phone>')
def wangpan2(phone):
    if g.phone==phone:#校验登录
        a=os.listdir('./upload/'+phone)
        return render_template('upload2.html',a=a,phone_s=phone)
    else:
        return '请去登录'

@wangpan_bp.route('/uploader2', methods = ['GET', 'POST']) #上传路由
def uploader2():
   if request.method == 'POST':
        phone = g.phone
        f = request.files['file'] #调用方法形成对象 ,f对象可以.filename获取文件名也可以f.save*(保存路径)    执行保存动作
        f.save(r'./upload/%s/%s'%(phone,f.filename)) #保存路径格式化进去文件名,保存。这里注意:phone是钩子给的认证信息,存也要存在私人文件夹里
        return redirect ('/wangpan2/%s'%phone)#存好了重定向也要定到私人目录下
@wangpan_bp.route('/down2/<name>')
def down2(name):
    print('g is ',g.phone)
    return send_file(r'./upload/%s/%s'%(g.phone,name),as_attachment=True)#这里也是把私人内容格式化进去

以上内容之外还要补充一个注册、登录内容,注册内容务必在注册的时候给用户成功用户单独建立一个标识文件夹,因为手机号唯一所以,不用怎么做冲突校验。

def login_user():
    u1 = User()

    if request.method=='POST':
        ph=request.form.get('phone')
        pd=request.form.get('password')
        rpd=request.form.get('repassword')
        if pd==rpd:
            if  User.query.filter(User.phone == ph).first() :
                pass
            else:
                u1.phone = ph
                u1.password=pd
                u1.username='test'
                db.session.add(u1)
                db.session.commit()#刷数据库,失败了就报错了
                os.mkdir('./upload/%s'%ph)#数据库更新成功就给他建个文件夹
                return '注册新用户完毕,返回输入手机号登录'
    return render_template('jiaban2.html',u1=u1.query.all())

@user_bp.route('/login_ok',methods=['POST','GET'])
def login_ok():
    u1 = User()

    if request.method=='POST':
        ph=request.form.get('phone')
        pd=request.form.get('password')
        user_0=User.query.filter(User.phone == ph).first()
        if  user_0 :
            if user_0.password==pd :
                session['phone']=user_0.phone
                return redirect('/wangpan')
            else:
                return '用户名或密码错误'
            
        else:

            return '用户名或密码错误'

登录页面 ,随便一贴得了

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">

    <title></title>
</head>
<body>
<form action="login" method="POST" style="text-align: center" >
<h1>查询员工编码</h1>      <input type="text" placeholder="员工编码" name="staff_code">
      <br>
     <input type="submit" value="查询">

</form>
<br>
<br>

<form action="login_user" method="POST" style="text-align: center" >
   <h1>注册新用户</h1>   <p><input type="text" placeholder="手机号" name="phone"></p>
      <p><input type="text" placeholder="密码" name="password"></p>
      <p><input type="text" placeholder="重输密码" name="repassword"></p>
      <br>
     <input type="submit" value="注册">

</form>
{%if phone_s %}
<h1>用户:{{phone_s}}你好,登录成功</h1>
{%else%}


<form action="login_ok" method="POST" style="text-align: center" >
   <h1>已注册用户登录</h1>   <p><input type="text" placeholder="手机号" name="phone"></p>
      <p><input type="text" placeholder="密码" name="password"></p>
    
      <br>
     <input type="submit" value="登录">
{%endif%}

</form>
</body>
</html>

效果如下:

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

丑爆了。。。但是~它能用,速度很快而且很好用,不正规,但是自己用,朋友用,也还行,凑合用也马马虎虎。好歹也是有验证的私人网盘,小公司用用也不是不可以,不像微信群里传个文件后期找还要翻几个月聊天记录。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-18 17:21:19  更:2021-10-18 17:23:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 21:05:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码