如何在Django中获取已在Laravel中注册的用户数据
Laravel侧开放用户数据供Django系统获取的落地方案
方案一:Laravel开放API接口(最推荐,耦合度最低)
是跨系统数据交互最通用的实现方式,两个系统互不侵入,后续扩展其他同步需求也很方便。
Laravel端实现步骤
- 用Laravel自带的Sanctum或者Passport做接口身份校验,避免接口公开泄露用户数据
- 安装Sanctum之后,给Django系统分配固定的API Token,Token权限仅开放用户数据查询,禁止修改、删除操作权限
- 定义接口路由,建议放在
routes/api.php下,加auth:sanctum中间件校验,示例路由代码:Route::get('/users/export', [UserController::class, 'exportForDjango'])->middleware('auth:sanctum'); - 控制器逻辑里按需返回字段,不要返回敏感信息比如密码哈希、支付关联数据,可增加分页/增量查询参数,比如传
last_updated_at只返回该时间之后新增/修改的用户,减少数据传输量
- 接口安全补充:限制请求IP仅允许Django服务器的IP访问,设置接口请求频率限制,比如每分钟最多10次请求
Django端实现步骤
- 用内置的
requests库发起请求,把Laravel分配的API Token放在请求头里,示例代码:
import requests headers = {"Authorization": "Bearer 你申请的Laravel API Token"} response = requests.get("https://你的laravel域名/api/users/export", headers=headers, params={"last_updated_at": "2024-01-01 00:00:00"}) user_list = response.json()
- 拿到数据后按需存入Django本地数据库,或者直接做逻辑处理,可配置定时任务定时拉取增量数据,不用每次业务都实时请求
方案二:两个系统共享用户数据库(适合内网部署场景,性能更高)
不需要走网络接口传输,查询性能更高,仅适合两个系统部署在同一内网、网络可互通的场景。
- 前提:Django服务器可以直接访问Laravel的用户数据库,且不需要公网暴露数据库端口
- Django端配置多数据库连接,在
settings.py里新增Laravel数据库的连接配置:
DATABASES = { 'default': { # 你原本的Django数据库配置 }, 'laravel_user': { 'ENGINE': 'django.db.backends.mysql', # 跟Laravel用的数据库类型保持一致 'NAME': 'laravel的库名', 'USER': '数据库用户名', 'PASSWORD': '数据库密码', 'HOST': 'Laravel数据库地址', 'PORT': '3306', } }
- 给Django创建用户表的Model,设置
managed = False,不会修改Laravel的表结构,示例:
from django.db import models class LaravelUser(models.Model): name = models.CharField(max_length=255) email = models.EmailField(unique=True) created_at = models.DateTimeField() class Meta: db_table = 'users' # Laravel用户表的表名,默认是users managed = False app_label = '你的Django应用名'
- 之后就可以直接在Django里用
LaravelUser.objects.using('laravel_user').all()查询用户数据,不用走接口传输 - 注意事项:给Django用的数据库账号仅开放users表的查询权限,禁止增删改权限,避免误操作修改Laravel的用户数据
方案三:定时导出文件同步(适合实时性要求低的场景)
实现成本最低,适合对数据实时性要求不高、不需要频繁同步的场景。
- Laravel端写定时任务,比如每天凌晨导出新增的用户数据为CSV/JSON文件,存到指定的服务器目录
- Django端写定时任务,从Laravel服务器拉取该文件,解析后存入本地
- 缺点是数据同步有延迟,不适合需要实时获取用户数据的场景
选择建议:优先选方案一,耦合度最低,后续扩展空间大;内网部署且对性能要求极高可选方案二;实时性要求很低的场景可选方案三。
内容的提问来源于stack exchange,提问作者Junaid
相关产品推荐
相关产品推荐

