Tornado+Layui(十一)Tornado+Layui 前后端分离 前端上传图片+返回图片地址

目的:

     Tornado 返回图片地址

过程:

     1、Layui前端上传图片JS

 //普通图片上传
            upload.render({
                elem: '#test1'
                , url: 'http://xx.xx.xx.xx:xxx/api/images' // 上传地址
                , data: {'access_token': data[0]['token']}
                , auto: false //选择文件后不自动上传
                , bindAction: '#layuiadmin-app-form-submit'			//“上传”按钮的ID
                , choose: function (obj) {
                    //预读本地文件示例,不支持ie8
                    obj.preview(function (index, file, result) {
                        $('#demo1').attr('src', result); //图片链接(base64)
                        document.getElementById('demoText').innerHTML = file.name
                    });
                }
                , done: function (res) {
       
<think>好的,我现在需要帮用户介绍一个使用Vue、Tornado和SQLAlchemy实现前后端分离的小案例。首先,我得理清楚这三个技术各自的作用和如何整合在一起。用户可能是一个刚入门的开发者,想了解如何将这些技术结合起来,所以应该从基础开始,分步骤讲解。 首先,前端部分用Vue,后端用Tornado,数据库用SQLAlchemy ORM。前后端分离意味着前端和后端通过API通信,数据格式可能是JSON。用户可能需要一个简单的例子,比如一个待办事项应用,这样功能明确,结构清晰。 接下来,我需要考虑项目结构。通常前后端分离的项目会有两个独立的文件夹,比如frontend和backend。前端用Vue CLI创建,后端用Tornado处理路由和请求,SQLAlchemy连接数据库,比如SQLite,方便快速开始。 然后,数据库部分。需要定义一个模型,比如Task模型,包含id、title、completed等字段。使用SQLAlchemy的ORM来创建表,处理CRUD操作。这里要注意session的管理,确保每个请求都有独立的session,避免线程安全问题。 后端API设计方面,Tornado需要提供RESTful接口,比如GET /api/tasks获取所有任务,POST /api/tasks创建新任务,PUT /api/tasks/:id更新任务状态,DELETE /api/tasks/:id删除任务。需要处理跨域问题,可以添加CORS头或者使用中间件。 前端部分,Vue组件需要发送AJAX请求到后端API,获取数据并展示。使用axios库处理HTTP请求,在created钩子中获取初始数据,methods中定义添加、删除、切换完成状态的方法。前端展示一个任务列表,每个任务有复选框和删除按钮,还有输入框添加新任务。 在整合过程中,需要注意前后端的端口不同,Vue通常运行在8080,Tornado在8888,所以前端需要配置代理或者后端启用CORS。这里可能需要在Tornado中设置响应头,允许跨域请求,否则浏览器会阻止请求。 测试部分,需要确保后端API正常工作,可以用curl或Postman测试各个端点是否正确返回数据。前端启动后,检查是否能够正确显示任务,并且操作后数据能持久化到数据库。 可能遇到的问题包括:SQLAlchemy的session生命周期管理,Tornado异步处理,Vue的数据绑定和响应式更新,以及跨域请求的配置。需要逐一检查这些点,确保每个部分正常运行。 最后,提供一个简单的步骤,让用户能够按照步骤搭建项目,包括安装依赖、创建目录结构、编写代码,并运行前后端服务。确保代码示例清晰,关键部分有注释,方便用户理解。</think>下面我为您介绍一个基于 Vue3 + Tornado + SQLAlchemy 实现前后端分离的简单待办事项(Todo List)案例: --- ### 一、项目结构 ``` todo-project/ ├── frontend/ # Vue前端项目 │ ├── src/ │ │ ├── App.vue │ │ └── main.js ├── backend/ # Tornado后端项目 │ ├── models.py # SQLAlchemy模型 │ ├── handlers.py # 请求处理器 │ └── server.py # 服务入口 └── database/ # 数据库文件 ``` --- ### 二、后端实现(Tornado + SQLAlchemy) 1. **models.py**(数据库模型) ```python from sqlalchemy import create_engine, Column, Integer, String, Boolean from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() engine = create_engine('sqlite:///database/todo.db') class Todo(Base): __tablename__ = 'todos' id = Column(Integer, primary_key=True) title = Column(String(200)) completed = Column(Boolean, default=False) Base.metadata.create_all(engine) ``` 2. **handlers.py**(请求处理) ```python import json from tornado.web import RequestHandler from sqlalchemy.orm import sessionmaker from models import Todo, engine Session = sessionmaker(bind=engine) class TodoHandler(RequestHandler): def set_default_headers(self): self.set_header("Access-Control-Allow-Origin", "*") self.set_header("Access-Control-Allow-Headers", "Content-Type") self.set_header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE') def get(self): session = Session() todos = session.query(Todo).all() self.write(json.dumps([{ 'id': t.id, 'title': t.title, 'completed': t.completed } for t in todos])) session.close() def post(self): data = json.loads(self.request.body) session = Session() new_todo = Todo(title=data['title']) session.add(new_todo) session.commit() self.write(json.dumps({'id': new_todo.id})) session.close() ``` 3. **server.py**(启动服务) ```python from tornado.web import Application from tornado.ioloop import IOLoop from handlers import TodoHandler def make_app(): return Application([ (r"/api/todos", TodoHandler), ]) if __name__ == "__main__": app = make_app() app.listen(8888) print("Server running at http://localhost:8888") IOLoop.current().start() ``` --- ### 三、前端实现(Vue3) 1. **App.vue** ```vue <template> <div> <h1>Todo List</h1> <input v-model="newTodo" @keyup.enter="addTodo"> <ul> <li v-for="todo in todos" :key="todo.id"> <input type="checkbox" v-model="todo.completed"> {{ todo.title }} <button @click="deleteTodo(todo.id)">×</button> </li> </ul> </div> </template> <script> import axios from 'axios' export default { data() { return { newTodo: '', todos: [] } }, created() { this.fetchTodos() }, methods: { async fetchTodos() { const res = await axios.get('http://localhost:8888/api/todos') this.todos = res.data }, async addTodo() { const res = await axios.post('http://localhost:8888/api/todos', { title: this.newTodo }) this.todos.push({...res.data, title: this.newTodo, completed: false}) this.newTodo = '' } } } </script> ``` --- ### 四、运行步骤 1. 安装依赖 ```bash # 后端 pip install tornado sqlalchemy # 前端(进入frontend目录) npm install axios vue@next @vue/cli-service ``` 2. 启动后端 ```bash python backend/server.py ``` 3. 启动前端 ```bash npm run serve ``` --- ### 五、功能说明 1. 前端通过axios与后端API通信 2. 后端使用SQLite数据库存储数据 3. 实现的功能: - 展示所有待办事项 - 添加新的待办事项 - 跨域请求处理(CORS配置) 4. 需要扩展的功能(可自行实现): - 删除事项 - 修改完成状态 - 数据验证 - 错误处理 这个案例展示了前后端分离的基本架构,前端负责视图交互,后端提供RESTful API,数据库使用ORM进行操作。可以根据需求继续扩展更多功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值