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>

效果如下:

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值