如何将树莓派Python生成的字典发送到Laravel框架并在视图中展示
解决方案
1 修正树莓派端Python代码
你当前的代码调用requests.post时传入了已序列化的JSON字符串,会导致Laravel收到的是字符串而非结构化JSON数据,直接传原始字典即可:
def readFile(): mac_dict = {} # 注意提前初始化字典,原代码缺这行 with open("/home/pi/Desktop/Progetti SIoTD/Bluetooth/device.txt", "r") as file: for i in file: line, *lines = i.split() if line in mac_dict: mac_dict[line] += lines else: mac_dict[line] = lines print(mac_dict) print("\n") # 去掉json.dumps,直接把字典传给requests的json参数 r = requests.post(ip, json=mac_dict) print(r.text)
2 修正Laravel路由配置
两个路由不要共用同一个方法,分开处理POST收数据、GET展示数据的逻辑:
web.php 路由(负责展示页面)
Route::get('dict', [DictionaryController::class, 'showDict'])->name('dict');
api.php 路由(负责接收树莓派上报的数据)
Route::post('dictionary', [DictionaryController::class, 'saveDict'])->name('dictionary');
3 修正控制器逻辑
HTTP是无状态协议,POST上报的数据需要先持久化存储,才能在后续GET请求访问页面时读取到,这里先以Laravel缓存做快速实现,你也可以换成存数据库:
use Illuminate\Support\Facades\Cache; class DictionaryController extends Controller { // 原有方法保留不影响 public function index() { return view('backend.auth.user.dictionary'); } public function store(Request $request) { } public function show($id) { } public function update(Request $request, $id) { // } public function destroy($id) { // } // 新增:接收树莓派POST的数据并存缓存 public function saveDict(Request $request) { // 拿到树莓派上报的所有JSON数据 $dictData = $request->all(); // 存到缓存,永久有效,你也可以设置过期时间 Cache::forever('raspberry_dict', $dictData); // 返回响应给树莓派 return response()->json(['code' => 0, 'msg' => '接收成功']); } // 新增:读取缓存数据传到视图展示 public function showDict() { // 从缓存拿数据,没有的话返回空数组 $dict = Cache::get('raspberry_dict', []); // 传到视图 return view('backend.auth.user.dictionary', compact('dict')); } }
4 视图层渲染展示
修改dictionary.blade.php文件,在content区块输出数据:
@extends('backend.layouts.app') @section('content') <div class="container"> <h3>树莓派上报的字典数据</h3> <!-- 格式化输出JSON,方便查看 --> <pre>{{ json_encode($dict, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) }}</pre> </div> @endsection
验证流程
- 先运行树莓派的代码上报一次数据
- 访问你的站点
/dict路由,即可看到上报的字典内容
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

