【无标题】从0到1 搭建一个vue3+Django项目

目录

      • 一、后端项目python django
      • 二、前端项目vite+vue3
      • 三、后端配置
        • 3.1 将路由指向app
        • 3.2 app下创建urls.py, 写入路由
        • 3.3 views写入test函数
        • 3.4 启动服务,访问路由
      • 四、前端配置
        • 4.1 安装一些工具库及创建文件
            • 4.1.1 安装需要用的三方库
            • 4.1.2 创建文件
        • 4.2 配置、写代码
            • 4.2.1 vite.config.js [参考](https://juejin.cn/post/7282691800858869797)
            • 4.2.2 src/main.js
            • 4.2.3 请求封装 [参考](https://juejin.cn/post/7036341194716086279)
            • 4.2.4 页面菜单
            • 4.2.5 页面
            • 4.2.6 路由 [参考](https://blog.csdn.net/xjtarzan/article/details/119736309)
            • 4.2.7 logo
            • 4.2.8 App.vue
        • 4.3 启动前端项目、测试接口联通性
      • 五、问题
        • 5.1 跨域![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1b9e520a4af1479e9f5a20bb523e1567.png)
            • 方法1:vite.config.js配置前端代理
            • 方法2:后端解除限制
        • 5.2 不允许访问
            • 方法1:在前端代理
            • 方法2:在后端加入白名单
      • 六、vue项目部署到Django
        • 6.1 前端打包
        • 6.2 将打包好的文件夹放到django项目中
            • 6.2.1 新建一个templates文件夹,放入前端打包文件
        • 6.3 修改ocrExcel/urls.py
        • 6.4 修改setting.py
            • 6.4.1 找到TEMPLATES,在DIRS中加入`os.path.join(BASE_DIR, 'templates/dist')`
            • 6.4.2 找到STATIC_URL,修改
        • 6.5 启动Django
      • 结语

基础环境版本:
python: 3.9.9
pip: 23.3.1
django: 4.2.7
node: 18.14.0
npm: 9.3.1
vue: 3.3.8
vite: 5.0.0
工具: vs code

一、后端项目python django

django 创建项目跟着官网步骤

  1. 创建项目:django-admin startproject corExcel
  2. 进入文件夹中 创建App:python manage.py startapp ocr
  3. 运行:python manage.py runserver
    在这里插入图片描述

二、前端项目vite+vue3

vite教程

  1. 根据需求创建项目npm create vite@latest ocr-excel-ui --template vue
    在这里插入图片描述
  2. 进入文件夹安装依赖:npm install
  3. 启动:npm run dev
    在这里插入图片描述

以下已用code打开项目

三、后端配置

3.1 将路由指向app
(此处app指ocr,使用python manage.py startapp ocr 创建 下不提示)

ocrEcxel/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path("api/", include("ocr.urls")),	# api为前端的接口路径
]
3.2 app下创建urls.py, 写入路由

此时app中并没有urls.py 所以需要新建,再写入代码
在这里插入图片描述

ocr/urls.py

from django.urls import path

from . import views

urlpatterns = [
    path("test", views.test, name="index"),	# test路径 对应views中的test函数,看下一步
]
3.3 views写入test函数

ocr/views.py

from django.shortcuts import render
from django.http import HttpResponse


# Create your views here.
def test(request):
    return HttpResponse("Test, HelloWorld.")	# 测试接口,这里直接返回一段话
3.4 启动服务,访问路由

python manage.py runserver
在这里插入图片描述

http://127.0.0.1:8000/api/test
在这里插入图片描述

到此后端接口基本通了,接下来配置前端项目

四、前端配置

4.1 安装一些工具库及创建文件
4.1.1 安装需要用的三方库
npm install element-plus 	# UI
npm install vue-router 		# 路由
npm install axios			# axios
npm install sass			# sass

#或者
npm install element-plus vue-router axios sass

在这里插入图片描述

4.1.2 创建文件
> src 
	> api			// 接口
		- index.js
		- request.js
		- status.js
		> module
			- test.js
	> assets		// 资源
		> svg
	> components	// 组件
		> Header
			- index.js
	> router		// 路由
		- index.js
		- routes.js
	> views			// 页面
		- index.vue

如图
在这里插入图片描述

4.2 配置、写代码
4.2.1 vite.config.js 参考
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],

  base: './',   // 在生产中服务时的基本公共路径
  publicDir: 'public',  // 静态资源服务的文件夹, 默认"public"
  resolve: {
    alias: {
      "@": path.resolve(__dirname, './src'), // 这里是将src目录配置别名为 @ 方便在项目中导入src目录下的文件
      "api": path.resolve(__dirname, './src/api'), // 这里是将src/api目录配置别名为 api 方便在项目中引入接口
    }
  },

  // 本地运行配置,及反向代理配置
  server: {
    host: '0.0.0.0', // 指定服务器主机名
    port: 3000, // 指定服务器端口
    open: true, // 在服务器启动时自动在浏览器中打开应用程序
    strictPort: false, // 设为 false 时,若端口已被占用则会尝试下一个可用端口,而不是直接退出
    https: false, // 是否开启 https
    cors: true, // 为开发服务器配置 CORS。默认启用并允许任何源
    proxy: { // 为开发服务器配置自定义代理规则
      // 选项写法
      '/api': {
        target: 'http://127.0.0.1:8000', //代理接口
        changeOrigin: true,
        // rewrite: (path) => path.replace(/^\/api/, '')  // 重写路径
      }
    }
  }
})
4.2.2 src/main.js
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import zhCn from 'element-plus/es/locale/lang/zh-cn'

import router from './router'


const app = createApp(App)
app.use(ElementPlus, {local: zhCn}) // element-plus 国际化

app.use(router) // 路由

app.mount('#app')
4.2.3 请求封装 参考

src/api/request.js

import axios from 'axios';
import { showMessage } from "./status";   // 引入状态码文件
import { ElMessage } from 'element-plus'  // 引入el 提示框,这个项目里用什么组件库这里引什么

// 设置接口超时时间
axios.defaults.timeout = 60000;

//http request 拦截器
axios.interceptors.request.use(
    config => {
        // 配置请求头
        config.headers = {
            //'Content-Type':'application/x-www-form-urlencoded',   // 传参方式表单
            'Content-Type': 'application/json;charset=UTF-8',        // 传参方式json
            'token': '80c483d59ca86ad0393cf8a98416e2a1'              // 这里自定义配置,这里传的是token
        };
        return config;
    },
    error => {
        return Promise.reject(error);
    }
);

//http response 拦截器
axios.interceptors.response.use(
    response => {
        return response;
    },
    error => {
        const { response } = error;
        if (response) {
            // 请求已发出,但是不在2xx的范围
            let message = showMessage(response.status);           // 传入响应码,匹配响应码对应信息
            ElMessage.warning(message);
            return Promise.reject(response.data);
        } else {
            ElMessage.warning('网络连接异常,请稍后再试!');
        }
    }
);

// 封装 GET POST 请求并导出
export default function request(url = '', params = {}, type = 'POST') {
    //设置 url params type 的默认值
    return new Promise((resolve, reject) => {
        let promise
        if (type.toUpperCase() === 'GET') {
            promise = axios({
                url,
                params
            })
        } else if (type.toUpperCase() === 'POST') {
            promise = axios({
                method: 'POST',
                url,
                data: params
            })
        }
        //处理返回
        promise.then(res => {
            resolve(res)
        }).catch(err => {
            reject(err)
        })
    })
}

src/api/status.js

export const showMessage = (status) => {
    let message = "";
    switch (status) {
        case 400:
            message = "请求错误(400)";
            break;
        case 401:
            message = "未授权,请重新登录(401)";
            break;
        case 403:
            message = "拒绝访问(403)";
            break;
        case 404:
            message = "请求出错(404)";
            break;
        case 408:
            message = "请求超时(408)";
            break;
        case 500:
            message = "服务器错误(500)";
            break;
        case 501:
            message = "服务未实现(501)";
            break;
        case 502:
            message = "网络错误(502)";
            break;
        case 503:
            message = "服务不可用(503)";
            break;
        case 504:
            message = "网络超时(504)";
            break;
        case 505:
            message = "HTTP版本不受支持(505)";
            break;
        default:
            message = `连接出错(${status})!`;
    }
    return `${message},请检查网络或联系管理员!`;
};

src/api/index.js

import test from './module/test.js'

export default {
    ...test,
}

src/api/module/test.js

import request from 'api/request'

export default {
    /**
     * Test
     */
    async testApi(params) {
      let url = `/api/test`;
      return await request(url, params, 'GET');
    },
}
4.2.4 页面菜单

src/components/Header/index.vue

<template>
    <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" :ellipsis="false" @select="handleSelect">
        <el-menu-item index="/">
            <img style="width: 100px" src="@/assets/svg/logo.svg" alt="Element logo" />
        </el-menu-item>
        <div class="flex-grow" />
        <el-menu-item index="/about">Processing Center</el-menu-item>
        <el-sub-menu index="/other">
            <template #title>Workspace</template>
            <el-menu-item index="2-1">item one</el-menu-item>
            <el-menu-item index="2-2">item two</el-menu-item>
            <el-menu-item index="2-3">item three</el-menu-item>
            <el-sub-menu index="2-4">
                <template #title>item four</template>
                <el-menu-item index="2-4-1">item one</el-menu-item>
                <el-menu-item index="2-4-2">item two</el-menu-item>
                <el-menu-item index="2-4-3">item three</el-menu-item>
            </el-sub-menu>
        </el-sub-menu>
    </el-menu>
</template>
  
<script lang="ts" setup>
import { ref } from 'vue'
import { useRouter } from 'vue-router'

let router = useRouter();

const activeIndex = ref('/') // 首页
const handleSelect = (key: string, keyPath: string[]) => {
    router.push(keyPath[0])	// 点击跳转
}
</script>
  
<style>
.flex-grow {
    flex-grow: 1;
}
</style>
  
4.2.5 页面

src/views/index.vue

<template>
    <el-button @click="handleClick">
        请求test
    </el-button>
</template>

<script setup>
import api from 'api/index';

let handleClick = async () => {
    let res = await api.testApi();
    console.log(res);
}
</script>

4.2.6 路由 参考

src/router/index.js

// 导入router所需的方法
import { createRouter, createWebHistory } from 'vue-router'

// 导入路由页面的配置
import routes from './routes'

// 路由参数配置
const router = createRouter({
    // 使用hash(createWebHashHistory)模式,(createWebHistory是HTML5历史模式,支持SEO)
    history: createWebHistory(),
    routes: routes,
})

// 全局前置守卫,这里可以加入用户登录判断
router.beforeEach((to, from, next) => {
    // 继续前进 next()
    // 返回 false 以取消导航
    next()
})

// 全局后置钩子,这里可以加入改变页面标题等操作
router.afterEach((to, from) => {
    const _title = to.meta.title
    if (_title) {
        window.document.title = _title
    }
})

// 导出默认值
export default router

src/router/routes

const routes = [
    {
        path: '/',
        name: 'index',
        title: '首页',
        component: () => import('@/views/index.vue'), //.vue不能省略
    }
]
export default routes
4.2.7 logo

logo
保存这个图标 放入src/assets/svg
在这里插入图片描述

4.2.8 App.vue

src/App.vue

<script setup>
import Header from '@/components/Header/index.vue'
</script>

<template>
  <Header></Header>
  <router-view />
</template>

<style scoped>
</style>
4.3 启动前端项目、测试接口联通性

npm run dev
在这里插入图片描述
浏览器打开,触发请求,成功返回
在这里插入图片描述

五、问题

5.1 跨域在这里插入图片描述
方法1:vite.config.js配置前端代理
 // 本地运行配置,及反向代理配置
  server: {
    host: '0.0.0.0', // 指定服务器主机名
    port: 3000, // 指定服务器端口
    open: true, // 在服务器启动时自动在浏览器中打开应用程序
    strictPort: false, // 设为 false 时,若端口已被占用则会尝试下一个可用端口,而不是直接退出
    https: false, // 是否开启 https
    cors: true, // 为开发服务器配置 CORS。默认启用并允许任何源
    proxy: { // 为开发服务器配置自定义代理规则
      // 选项写法
      '/api': {
        target: 'http://127.0.0.1:8000', //代理接口
        changeOrigin: true,
        // rewrite: (path) => path.replace(/^\/api/, '')  // 重写路径
      }
    }
  }
方法2:后端解除限制

pip install django-cors-headers

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',    # 添加1,注意中间件的添加顺序
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
CORS_ORIGIN_ALLOW_ALL = True  

在这里插入图片描述

5.2 不允许访问

DisallowedHost at /api/test
Invalid HTTP_HOST header: ‘10.102.88.76:3000’. You may need to add ‘10.102.88.76’ to ALLOWED_HOSTS.

在这里插入图片描述
解决:

方法1:在前端代理

vite.config.js中加上配置:changeOrigin: true,
在这里插入图片描述

方法2:在后端加入白名单

setting.py中的 ALLOWED_HOSTS数组中 加上自己IP或 ‘*’ (全部允许)
在这里插入图片描述

六、vue项目部署到Django

6.1 前端打包

npm run build
在这里插入图片描述
此时在项目中出现了打包后的dist文件夹
在这里插入图片描述

6.2 将打包好的文件夹放到django项目中
6.2.1 新建一个templates文件夹,放入前端打包文件

在这里插入图片描述

6.3 修改ocrExcel/urls.py
from django.contrib import admin
from django.urls import path, include
from django.views.generic import TemplateView

urlpatterns = [
    path('admin/', admin.site.urls),
    path("api/", include("ocr.urls")),	# api为前端的接口路径
    path('', TemplateView.as_view(template_name="index.html")), # 
]
6.4 修改setting.py
6.4.1 找到TEMPLATES,在DIRS中加入os.path.join(BASE_DIR, 'templates/dist')

如下

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates/dist')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
6.4.2 找到STATIC_URL,修改

STATIC_URL = 'static/' 修改为: STATIC_URL = 'assets/'
再加个配置,总体如下

STATIC_URL = 'assets/' # 注意静态文件的路径
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "templates/dist/assets"),    # 添加2,注意静态文件的路径
]
6.5 启动Django

python manage.py runserver
访问:出现了页面
在这里插入图片描述
发送一个请求试试:
在这里插入图片描述
成功了,顺利返回

就这样结束了吗?还没有,还有个坑,这时候我们点击菜单的“Processing Center”,到 http://127.0.0.1:8000/about
可以正常跳转过来
在这里插入图片描述

但是,如果这时候刷新页面会出现什么呢?
在这里插入图片描述
怎么一刷新页面就404了
因为vue是单页面应用,这时候在/about下刷新页面,django会认为这是一个后端请求,而urls.py中又找不到相应的路由,就报了404

解决方式就是修改一下6.3步的urls.py 文件

"""
from django.contrib import admin
from django.urls import path, include, re_path
from django.views.generic import TemplateView

urlpatterns = [
    path('admin/', admin.site.urls),
    path("api/", include("ocr.urls")),	# api为前端的接口路径
    re_path("", TemplateView.as_view(template_name="index.html")),	# vue是单页面应用,将其余所有路由转到vue
]

将所有非admin、api开头的请求都转到vue,就可以自由刷新页面了,这样也存在一个问题,就是后端没有404的情况了,这就需要交给前端处理。创建一个404的页面,前端没有路由时重定向到404页面。

结语

就先到这里吧,架子搭好,开始写代码了,后面遇到什么问题再更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/221828.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索 IndexedDB 的世界:大规模数据存储的解决方案

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

MySQL 数据库如何实现 XA 规范?

本文我们来讨论 MySQL 的 XA 规范有哪些应用相关的内容。 MySQL 为我们提供了分布式事务解决方案&#xff0c;在前面的内容中提到过 binlog 的同步&#xff0c;其实是 MySQL XA 规范的一个应用&#xff0c;那么 XA 规范是如何定义的&#xff0c;具体又是如何应用的呢&#xff…

『App自动化测试之Appium基础篇』| 从定义、原理、环境搭建、安装问题排查等深入了解Appium

『App自动化测试之Appium基础篇』| 从定义、原理、环境搭建、安装问题排查等深入了解Appium 1 关于Android UI自动化测试2 Appium简介3 Appium原理3.1 Android端过程3.2 iOS端过程 4 补充内容5 JDK下载6 JDK配置7 SDK下载8 SDK配置9 配置Android环境10 安装NodeJs11 解决node安…

chineseocr项目不使用web推理-docker容器化

整个流程介绍 拉取 ufoym/deepo 镜像 -- 因为包含了主流深度学习框架&#xff0c;镜像4G出头。拉取 chineseocr 项目代码。修改代码&#xff0c;不使用web&#xff0c;增加命令行传入图片路径的功能打包成docker镜像。 开始 拉取 ufoym/deepo 镜像 &#xff1a;cpu版本为例 do…

Gitlab代码集成阿里代码检查P3C

文章目录 一、获取P3C-PMD1、下载源码2、打包3、上传文件 二、创建hooks1、指定项目2、全局设置 三、使用 一、获取P3C-PMD 1、下载源码 源码地址&#xff1a;https://github.com/alibaba/p3c 也可以直接下载打包好的文件&#xff0c; p3c-pmd-2.1.1-jar.zip: https://pan…

Javaweb之前端工程打包部署的详细解析

6 打包部署 我们的前端工程开发好了&#xff0c;但是我们需要发布&#xff0c;那么如何发布呢&#xff1f;主要分为2步&#xff1a; 前端工程打包 通过nginx服务器发布前端工程 6.1 前端工程打包 接下来我们先来对前端工程进行打包 我们直接通过VS Code的NPM脚本中提供的…

Python与PHP:编写大型爬虫的适用性比较

目录 一、引言 二、Python编写爬虫的优势 1、强大的数据处理能力 2、丰富的网络库和框架 3、良好的可读性和易维护性 4、社区支持和生态系统 三、PHP编写爬虫的优势 1、简单易学 2、广泛的应用领域 3、高效的性能 4、灵活的请求处理方式 四、大型爬虫的编写实例&am…

java开发神器之ecplise的基本使用

java开发神器之ecplise的基本使用 一、ecplise的安装二、利用ecplise创建工作空间 一、ecplise的安装 免安装eclipse程序包 二、利用ecplise创建工作空间 1、准备好eclipse的程序包&#xff0c;右键执行程序。 2、若打开eclipse显示如下第一张图的界面提示&#xff0c;是因…

生产环境_从数据到层级结构JSON:使用Spark构建多层次树形数据_父子关系生成

代码补充了&#xff01;兄弟萌 造的样例数据 val data Seq(("USA", "Male", "Asian", "Chinese"),("USA", "Female", "Asian", "Chinese"),("USA", "Male", "Bl…

网络之路26:STP生成树协议

正文共&#xff1a;2222 字 19 图&#xff0c;预估阅读时间&#xff1a;3 分钟 目录 网络之路第一章&#xff1a;Windows系统中的网络 0、序言 1、Windows系统中的网络1.1、桌面中的网卡1.2、命令行中的网卡1.3、路由表1.4、家用路由器 网络之路第二章&#xff1a;认识企业设备…

碳信用市场的未来:中碳CCNG的愿景

在全球碳减排努力日益增强的背景下&#xff0c;中国碳中和发展集团有限公司&#xff08;简称中碳CCNG&#xff09;正以其创新的碳交易平台引领行业新趋势。中碳CCNG提供的一站式综合服务不仅包括碳信用的托管、买卖和抵消&#xff0c;而且通过其综合性数字平台&#xff0c;促进…

【100天精通Python】Day75:Python机器学习-第一个机器学习小项目_鸾尾花分类项目(上)

目录 1 机器学习中的Helloworld _鸾尾花分类项目 2 导入项目所需类库和鸾尾花数据集 2.1 导入类库 2.2 scikit-learn 库介绍 &#xff08;1&#xff09;主要特点&#xff1a; &#xff08;2&#xff09;常见的子模块&#xff1a; 3 导入鸾尾花数据集 3.1 概述数据 3.…

matlab 最小二乘拟合空间直线(方法二)

目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理

IT外包服务内容有哪些?

在信息技术迅猛发展的今天&#xff0c;越来越多的企业为了提高效率、降低成本以及更专注于核心业务&#xff0c;选择将信息技术工作外包给专业的IT服务公司。IT外包包含很多不同的服务&#xff0c;以下是对主要服务内容的简要概述。 1. 网络建设与维护 网络是现代企业信息系统…

jquery实现省市区三级联动

一、技术&#xff1a; 前端采用的是jsp页面 后端采用springmvcmybatismysql8 效果图 二、cascadeSelect.jsp页面 <% page contentType"text/html;charsetUTF-8" language"java" %> <%String path request.getContextPath();String basePath …

每日一练2023.12.5—— 一帮一【PTA】

题目链接&#xff1a; L1-030 一帮一 题目要求&#xff1a; “一帮一学习小组”是中小学中常见的学习组织方式&#xff0c;老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作&#xff0c;即在得到全班学生的排名后&…

西安安泰——ATA-1220E宽带放大器

ATA-1220E宽带放大器简介 ATA-1220E是一款可放大交直流信号的差分通道宽带放大器。其最大输出电压 60Vp-p(30Vp)&#xff0c;最大输出电流1Ap&#xff08;>50Hz&#xff09;。电压增益数控可调&#xff0c;一键保存设置&#xff0c;提供了方便简洁的操作选择&#xff0c;可…

华为无线配置模板 一

华为无线配置模板 一 拓扑图1.配置SwitchA和AC&#xff0c;使AP与AC之间能够传输CAPWAP报文2.配置AC作为DHCP服务器&#xff0c;为STA和AP分配IP地址3.配置AP上线4.配置WLAN业务参数5.验证配置结果 拓扑图 采用如下的思路配置小型网络的WLAN基本业务&#xff1a;1.配置AP、AC、…

阿里云账号注册完成实名认证免费领取云服务器4台

注册阿里云&#xff0c;免费领云服务器&#xff0c;每月280元额度&#xff0c;3个月试用时长&#xff0c;可快速搭建网站/小程序&#xff0c;部署开发环境&#xff0c;开发多种企业应用&#xff0c;共3步骤即可免费领取阿里云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com…

一键抠图1:Python实现人像抠图 (Portrait Matting)

一键抠图1&#xff1a;Python实现人像抠图 (Portrait Matting) 目录 一键抠图1&#xff1a;Python实现人像抠图 (Portrait Matting) 1. 项目介绍 2. 抠图算法 3. Matting数据集 4. MODNet模型 (1) 项目安装 (2) 数据集说明 (3) MODNet模型 5. Demo测试效果 6. 源码下载…