Files
micro_servers/dnfs/dnfs.py
T
2026-07-24 08:54:22 +08:00

208 lines
3.7 KiB
Python
Executable File

#!/usr/bin/env python3
'''
Dendrachy Network File-System (dnfs)
树状网络文件系统
可能加入数据库加密功能。
'''
from flask import Flask, request, jsonify, render_template
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy
from waitress import serve
import os
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
CORS(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'notes.db')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class Note(db.Model):
id = db.Column(db.Integer, primary_key=True)
pid = db.Column(db.Integer, nullable=False)
title = db.Column(db.String(128), nullable=False)
content = db.Column(db.Text, nullable=False)
def __repr__(self):
return f"<Node {self.title}>"
with app.app_context():
db.create_all()
# eg: {
# "pid": "0",
# "title": "test",
# "content": "hello"
#}
@app.route('/add_note', methods=['POST'])
def add_note():
data = request.get_json()
pid = data.get('pid')
title = data.get('title')
content = data.get('content')
if pid is None or not title or not content:
return jsonify({"error": "Pid, title and content are required"}), 400
new_note = Note(pid=int(pid), title=title, content=content)
with app.app_context():
db.session.add(new_note)
db.session.commit()
return jsonify({"message": "Note added successfully"}), 200
# {“pid”: "0"}
@app.route('/get_notes', methods=["POST"])
def get_notes():
data = request.get_json()
pid = data.get('pid')
if not pid:
pid = 0
with app.app_context():
notes = Note.query.filter(Note.pid == int(pid))
result = [{'id': note.id, 'pid': note.pid, 'title': note.title, 'content':note.content} for note in notes]
return jsonify(result), 200
# eg: {"id": "1"}
@app.route('/delete_note', methods=['POST'])
def delete_note():
data = request.get_json()
note_id = data.get('id')
if note_id:
return jsonify({"error": "Note ID is required"}), 400
with app.app_context():
notes = Note.query.filter(Note.pid == int(note_id))
# 有子节点的情况不可删除
if not notes:
return jsonify({'error': 'this node has a child'}), 400
note = Note.query.get(note_id)
if note:
db.session.delete(note)
db.session.commit()
return jsonify({'message': "Note deleted successfully"}), 200
else:
return jsonify({"error": "Note not found"}), 404
# eg: {
# "id": "1",
# "pid": "0",
# "title": "test",
# "content": "hello"
#}
@app.route('/update_note', methods=['POST'])
def update_note():
data = request.get_json()
id = data.get('id')
pid = data.get('pid')
title = data.get('title')
content = data.get('content')
if id is None or pid is None or not title or not content:
return jsonify({"error": "Invalid param"}), 400
with app.app_context():
note = Note.query.get(id)
if note:
note.pid = pid
note.title = title
note.content = content
db.session.commit()
return jsonify({'message': "Your change is up-to-date."}), 200
else:
return jsonify({'error': 'Note not found'}), 400
#@app.route('/')
#def view_page():
# """返回应用主页"""
# return render_template('index.html')
ADDR='127.0.0.1'
PORT=8006
if __name__ == "__main__":
print(f'Listen at http://{ADDR}:{PORT}')
#app.run(host="127.0.0.1", port=8006)
serve(app, host='127.0.0.1', port=8006)