You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Vue Cli构建的静态项目集成到Django并适配媒体路径

Vue静态文件集成Django单端口部署及媒体路径调整方案

一、配置Vue项目构建输出路径

修改Vue项目根目录下的vue.config.js(无则新建),将构建产物直接输出到Django项目的静态文件目录:

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  outputDir: '../your_django_project/static/vue', // 替换为你的Django项目static目录下的vue子文件夹
  assetsDir: 'assets',
  publicPath: '/static/vue/' // 对应Django中STATIC_URL的子路径
})

执行npm run build,构建后的静态文件会自动生成到指定的Django静态目录中。

二、Django项目核心配置调整

1. 静态与媒体文件配置(settings.py)

import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# 静态文件配置
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # 生产环境静态文件收集目录
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'), # 包含Vue构建产物的static目录
]

# 媒体文件配置
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # 你的媒体文件存储根目录

2. 路由配置(urls.py)

添加媒体文件服务路由,并配置前端路由的兜底规则,确保所有非API请求返回Vue入口页面:

from django.contrib import admin
from django.urls import path, re_path
from django.views.generic import TemplateView
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    # 你的Django API路由...
    # Vue前端入口,匹配所有非API路径
    re_path(r'^.*$', TemplateView.as_view(template_name='vue/index.html')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # 开发环境媒体文件服务,生产环境建议用Nginx托管

3. 创建Vue入口模板(templates/vue/index.html)

将Vue构建生成的index.html内容复制到该模板文件中,保留原有的静态资源路径(已通过vue.config.js适配Django的STATIC_URL)。

三、Vue组件媒体路径修改

原组件中require加载媒体文件的方式不再适用,媒体文件由Django的MEDIA_URL直接服务,修改视频组件如下:

<template>
  <div class="container-fluid px-0">
    <div class="video-wrapper">
      <!-- 直接用MEDIA_URL拼接视频路径 -->
      <video ref="videoRef" :src="`${process.env.VUE_APP_MEDIA_URL}${videoPath}`" class="video-element" autoplay muted></video>
      <div class="video-caption container">
        <h2 class="RalewayFont multimedia_title" style="color: #F5811C;">{{ videoContent.titulo }}</h2>
        <p class="text-white description_Multimedia RalewayFont ">{{ videoContent.descripcion }}</p>
        <a href="#" class="btn btn-outline-light button_Multimedia RalewayFont" style="border-radius: 50px;" @click="restartVideo">Menú</a>
      </div>
    </div>
  </div>
</template>

<script>
import { ref, onMounted, inject } from 'vue';

export default {
  setup() {
    const data = inject('$data');
    const videoRef = ref(null);

    const playVideo = () => {
      videoRef.value.play();
    };

    const restartVideo = () => {
      videoRef.value.currentTime = 0;
      videoRef.value.play();
    };

    onMounted(() => {
      videoRef.value.addEventListener('ended', restartVideo);
      playVideo(); // 组件挂载时自动播放视频
    });

    const videoPath = data.Multimedia_Principal[0].video;
    const videoContent = data.Multimedia_Principal[0];

    return {
      videoRef,
      videoPath,
      videoContent,
      restartVideo
    };
  }
};
</script>

在Vue项目根目录的.env.production文件中配置环境变量:

VUE_APP_MEDIA_URL=/media/

四、生产环境部署注意事项

  1. 收集静态文件:执行python manage.py collectstatic,将所有静态文件(含Vue构建产物)收集到STATIC_ROOT目录。
  2. 媒体文件托管:生产环境建议用Nginx或Apache直接托管MEDIA目录,避免Django处理媒体请求,示例Nginx配置片段:
location /media/ {
    alias /path/to/your/django_project/media/;
}

location /static/ {
    alias /path/to/your/django_project/staticfiles/;
}
  1. 路由兼容:确保Django的catch-all路由正确返回Vue的index.html,避免页面刷新出现404。

内容的提问来源于stack exchange,提问作者Gustavo Adolfo Pérez Pérez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:47:48