夫今之世,数据如江河奔涌,服务器犹舟楫,载之而行。然云阁价昂,非布衣可轻取。余今所述,乃以内网穿透为径,Flask为梁,SQLite为库,不费一钱而筑服务器之法。
此法之利有三:
其一,内网穿透,可使深闺之机,通达四海,如凿壁引光,穷巷变通衢;
其二,Flask轻巧,十行代码可立门户,路由如设驿道,模板似绘丹青,学之易,用之捷;
其三,SQLite微而能容,无需外设数据库,一文件藏万卷,增删查改,信手拈来。
然亦有其弊:
其一,内网穿透,倚人篱下,免费者多有限制,带宽如羊肠,连接若游丝,猝然中断,亦未可知;
其二,Flask虽轻,难承千钧,若访客如潮,恐响应迟缓,非商用之选;
其三,SQLite虽便,难堪大任,事务繁复时,锁争如市,性能骤降。
故此法宜于习练、小用、急就,若求稳固、高效、商用,则当另择良材。然技多不压身,知此道者,纵无千金,亦能自建琼楼,岂不快哉?
是为序。
思路:
夫以 natapp凿壁为隧,洞开八秩之门(注:80端口),得HTTP通衢之址。以此址饲于Python Flask之架,佐以SQLite理数术,遂成奇巧:
[1]开通80端口
内网穿透有种方法,这里只举一例natapp
下载
进入官网
https://natapp.cn/
主页下载压缩包解压,得到natapp.exe文件
配置
隧道开通
夫免费者,如朝菌暮枯,旬日辄逝。然吾辈可效春韭之刈——旧隧既颓,新道复凿,更迭之间,永续无绝。

使用默认配置

然后复制authtoken

隧道绑定
新建一个记事本
将下面的内容复制到里面
将 authtoken= 后面内容改成刚才复制的authtoken,就可以识别到我们的隧道
修改文件名为config.ini
#将本文件放置于natapp同级目录 程序将读取 [default] 段
#在命令行参数模式如 natapp -authtoken=xxx 等相同参数将会覆盖掉此配置
#命令行参数 -config= 可以指定任意config.ini文件
[default]
authtoken= 23d211111e71ef7
clienttoken= #对应客户端的clienttoken,将会忽略authtoken,若无请留空,
log=none #log 日志文件,可指定本地文件, none=不做记录,stdout=直接屏幕输出 ,默认为none
loglevel=ERROR #日志等级 DEBUG, INFO, WARNING, ERROR 默认为 DEBUG
http_proxy= #代理设置 如 http://10.123.10.10:3128 非代理上网用户请务必留空
运行natapp.exe弹出的窗口没有错误信息就成功了
这个就是我电脑80端口的网址,需要复制
[2]编写服务器和客户端框架
需要下载第三方库,写完后看少什么下载什么就行了
数据库_func.py
很显然下面代码用来初始化数据库,直接将变量名修改用就行
我将其单独放在一个数据库_func.py文件中,在服务器中导入此方法。看起来更简洁
import sqlite3
数据库= '数据.db'
conn = sqlite3.connect(数据库)
c = conn.cursor()
# 数据库初始化
def 初始化数据库():
# 创建用户信息表
c.execute('''CREATE TABLE IF NOT EXISTS 用户信息
(用户名 TEXT PRIMARY KEY, 密码 TEXT, 金币 INTEGER,
区域左上x INTEGER, 区域左上y INTEGER,
区域右下x INTEGER, 区域右下y INTEGER)''')
# 创建建筑信息表
c.execute('''CREATE TABLE IF NOT EXISTS 建筑信息
(建筑名 TEXT,所属用户 TEXT, 血量 INTEGER, x坐标 INTEGER, y坐标 INTEGER)''')
conn.commit()
服务器.py
一般使用GET和POST两种处理就够了
GET指客户端获取服务端的信息,我用于初始化
POST指客户端向服务器发送信息,我用于进行数据的删改,或者也可以发送一张图片让服务器处理完后发回去
把最后一行的端口对应正确
以下是两个方法的示例
from 数据库_func import *
from flask import Flask, request, jsonify
import sqlite3
from flask_cors import CORS
app = Flask(__name__)
CORS(app) # 允许跨域请求
初始化数据库()
# 查看用户数据接口
@app.route('/get_users', methods=['GET'])
def get_users():
conn = sqlite3.connect(数据库)
c = conn.cursor()
c.execute('SELECT * FROM 用户信息')
users = [{
'用户名': row[0],
'密码': row[1],
'金币': row[2],
'区域左上x': row[3],
'区域左上y': row[4],
'区域右下x': row[5],
'区域右下y': row[6]
} for row in c.fetchall()]
conn.close()
return jsonify(users)
# 添加建造请求处理接口
@app.route('/build', methods=['POST'])
def handle_build_request():
data = request.get_json()
# 提取建筑信息(与数据库表结构对应)
建筑名 = data.get('建筑名')
所属用户 = data.get('所属用户')
血量 = data.get('血量')
x坐标 = data.get('x坐标')
y坐标 = data.get('y坐标')
# 验证必要参数
if not all([建筑名, 所属用户, 血量, x坐标, y坐标]):
return jsonify({'status': 'error', 'message': '缺少必要参数'}), 400
try:
conn = sqlite3.connect(数据库)
c = conn.cursor()
# 插入建筑信息(使用参数化查询防止SQL注入)
c.execute('''INSERT INTO 建筑信息 (建筑名, 所属用户, 血量, x坐标, y坐标)
VALUES (?, ?, ?, ?, ?)''',
(建筑名, 所属用户, 血量, x坐标, y坐标))
conn.commit()
return jsonify({'status': 'success', 'message': '建筑创建成功'})
except Exception as e:
conn.rollback()
return jsonify({'status': 'error', 'message': f'数据库错误: {str(e)}'}), 500
finally:
if conn:
conn.close()
# 启动服务器,指定80端口,改端口的需要修改
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80, debug=True)
请求_func.py
再编写一个专门有请求功能的代码,在编写客户端时导入方法用就行了
注意BASE_URL 需要改成复制的natapp的网址
对应了服务器的GET和POST两个方法
flask库详细操作可参考
https://www.bookstack.cn/read/flask-10/3.md
import requests
import json # 添加JSON模块导入
# 服务器URL(确保服务器已启动)
BASE_URL = 'http://33333333cb6.natappfree.cc' #修改成运行natapp.exe后黑框里复制的网址
def 获取用户数据():
try:
response = requests.get(f'{BASE_URL}/get_users')
if response.status_code == 200:
用户数据 = response.json()
print('用户数据:')
for 用户 in 用户数据:
print(f"用户名: {用户['用户名']}, 金币: {用户['金币']}, 区域左上角: ({用户['区域左上x']},{用户['区域左上y']}), 区域右下角: ({用户['区域右下x']},{用户['区域右下y']})")
return 用户数据
else:
print(f"请求失败,状态码: {response.status_code}")
except Exception as e:
print(f"请求发生错误: {str(e)}")
def 发送建造请求(建筑名, 所属用户, 血量, x坐标, y坐标):
try:
response = requests.post(f'{BASE_URL}/build', json={
'建筑名': 建筑名,
'所属用户': 所属用户,
'血量': 血量,
'x坐标': x坐标,
'y坐标': y坐标
})
# 解析JSON响应(替换原字符串比较方式)
response_data = response.json()
# 检查status字段是否为success
return response_data.get('status') == 'success'
except json.JSONDecodeError:
print("服务器响应不是有效的JSON格式")
return False
except Exception as e:
print(f"请求发生错误: {str(e)}")
return False
结语
夫三术合璧,可于陋室掌乾坤:
借内网穿透之术,使深闺主机化云台,无金购域而天下可达;仗Flask十行立阁,控路由如执虎符,展模板若现星图,遂令方寸之地应万象之求;佐以SQLite藏卷,虽一纸之薄,然增删查改间,名册典藏尽在彀中。
终成布衣神器:
书阁可筑,名册可录,天机可演,API可设。纵无千金之资,然持此道者,以代码为梁,穿透为桥,微库为仓,竟使寒门主机纳九霄云气。诗云:莫笑芥子无麟阁,一机藏尽九重天!
1749

被折叠的 条评论
为什么被折叠?



