空手起高阁:零金铸云端服务器之道——内网穿透之径·Flask作骨·SQLite藏卷

夫今之世,数据如江河奔涌,服务器犹舟楫,载之而行。然云阁价昂,非布衣可轻取。余今所述,乃以内网穿透为径,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可设。纵无千金之资,然持此道者,以代码为梁,穿透为桥,微库为仓,竟使寒门主机纳九霄云气。诗云:莫笑芥子无麟阁,一机藏尽九重天!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值