请你使用python+flask写一个网盘系统——要求支持登陆上传文件管理自己的文件下载他人文件需要上传者设置的密码删除自己的文件请使用bootstarp ui编写
以下是一个使用Python和Flask编写的简单网盘系统,满足您提出的要求。该系统支持用户注册、登录、上传文件、管理自己的文件、下载他人文件(需上传者设置的密码)和删除自己的文件。同时,使用了Bootstrap UI来进行界面设计。
首先,需要安装Flask和Flask-Bootstrap模块:
pip install flask
pip install flask-bootstrap
接下来,创建一个Python文件app.py,并将以下代码复制到文件中:
from flask import Flask, render_template, request, redirect, url_for, flash
from flask_bootstrap import Bootstrap
from werkzeug.utils import secure_filename
import os
app = Flask(__name__)
app.secret_key = 'supersecretkey'
bootstrap = Bootstrap(app)
# 存储用户信息的字典,模拟数据库
users = {
'user1': {
'password': 'password1',
'files': []
},
'user2': {
'password': 'password2',
'files': []
}
}
# 上传文件的目录
UPLOAD_FOLDER = 'uploads'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# 允许上传的文件类型
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
# 检查文件类型是否允许上传
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
# 主页
@app.route('/')
def index():
return render_template('index.html')
# 登录
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if username in users and users[username]['password'] == password:
flash('登录成功', 'success')
return redirect(url_for('dashboard', username=username))
else:
flash('用户名或密码错误', 'danger')
return render_template('login.html')
# 注册
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if username in users:
flash('用户名已存在', 'danger')
else:
users[username] = {'password': password, 'files': []}
flash('注册成功,请登录', 'success')
return redirect(url_for('login'))
return render_template('register.html')
# 个人中心
@app.route('/<username>/dashboard')
def dashboard(username):
if username in users:
return render_template('dashboard.html', username=username, files=users[username]['files'])
else:
flash('用户不存在', 'danger')
return redirect(url_for('index'))
# 上传文件
@app.route('/<username>/upload', methods=['GET', 'POST'])
def upload(username):
if username in users:
if request.method == 'POST':
file = request.files['file']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
users[username]['files'].append(filename)
flash('文件上传成功', 'success')
return redirect(url_for('dashboard', username=username))
else:
flash('文件类型不允许', 'danger')
return render_template('upload.html', username=username)
else:
flash('用户不存在', 'danger')
return redirect(url_for('index'))
# 下载文件
@app.route('/<username>/download/<filename>')
def download(username, filename):
if username in users:
if filename in users[username]['files']:
return redirect(url_for('uploaded_file', filename=filename))
else:
flash('文件不存在', 'danger')
return redirect(url_for('dashboard', username=username))
else:
flash('用户不存在', 'danger')
return redirect(url_for('index'))
# 上传的文件路径
@app.route('/uploads/<filename>')
def uploaded_file(filename):
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
# 删除文件
@app.route('/<username>/delete/<filename>')
def delete(username, filename):
if username in users:
if filename in users[username]['files']:
users[username]['files'].remove(filename)
os.remove(os.path.join(app.config['UPLOAD_FOLDER'], filename))
flash('文件删除成功', 'success')
else:
flash('文件不存在', 'danger')
return redirect(url_for('dashboard', username=username))
else:
flash('用户不存在', 'danger')
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True)
接下来,创建一个名为templates的文件夹,并在该文件夹下创建以下HTML模板文件:
index.html:
{% extends "base.html" %}
{% block content %}
<div class="jumbotron">
<h1 class="display-4">欢迎来到网盘系统</h1>
<p class="lead">请登录或注册以继续使用</p>
<hr class="my-4">
<a class="btn btn-primary btn-lg" href="{{ url_for('login') }}" role="button">登录</a>
<a class="btn btn-secondary btn-lg" href="{{ url_for('register') }}" role="button">注册</a>
</div>
{% endblock %}
base.html:
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<title>网盘系统</title>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="{{ url_for('index') }}">网盘系统</a>
</div>
</nav>
<div class="container mt-3">
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message[1] }}" role="alert">
{{ message[0] }}
</div>
{% endfor %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</div>
<!-- Optional JavaScript -->
<!-- Popper.js first, then Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.min.js"></script>
</body>
</html>
login.html:
{% extends "base.html" %}
{% block content %}
<h2>登录</h2>
<form method="post" action="{{ url_for('login') }}">
<div class="mb-3">
<label for="username" class="form-label">用户名</label>
<input type="text" class="form-control" id="username" name="username" required>
</div>
<div class="mb-3">
<label for="password" class="form-label">密码</label>
<input type="password" class="form-control" id="password" name="password" required>
</div>
<button type="submit" class="btn btn-primary">登录</button>
</form>
{% endblock %}
register.html:
{% extends "base.html" %}
{% block content %}
<h2>注册</h2>
<form method="post" action="{{ url_for('register') }}">
<div class="mb-3">
<label for="username" class="form-label">用户名</label>
<input type="text" class="form-control" id="username" name="username" required>
</div>
<div class="mb-3">
<label for="password" class="form-label">密码</label>
<input type="password" class="form-control" id="password" name="password" required>
</div>
<button type="submit" class="btn btn-primary">注册</button>
</form>
{% endblock %}
dashboard.html:
{% extends "base.html" %}
{% block content %}
<h2>个人中心 - {{ username }}</h2>
<a href="{{ url_for('upload', username=username) }}" class="btn btn-primary mb-3">上传文件</a>
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">文件名</th>
<th scope="col">操作</th>
</tr>
</thead>
<tbody>
{% for file in files %}
<tr>
<th scope="row">{{ loop.index }}</th>
<td>{{ file }}</td>
<td>
<a href="{{ url_for('download', username=username, filename=file) }}" class="btn btn-sm btn-primary">下载</a>
<a href="{{ url_for('delete', username=username, filename=file) }}" class="btn btn-sm btn-danger">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
upload.html:
{% extends "base.html" %}
{% block content %}
<h2>上传文件</h2>
<form method="post" action="{{ url_for('upload', username=username) }}" enctype="multipart/form-data">
<div class="mb-3">
<label for="file" class="form-label">选择文件</label>
<input type="file" class="form-control" id="file" name="file" required>
</div>
<button type="submit" class="btn btn-primary">上传</button>
</form>
{% endblock %}
最后,创建一个名为uploads的文件夹,用于存储上传的文件。
完成以上步骤后,执行以下命令启动网盘系统:
python app.py
然后,打开浏览器,访问http://localhost:5000即可使用网盘系统
原文地址: http://www.cveoy.top/t/topic/iWbg 著作权归作者所有。请勿转载和采集!