Python中Django项目部署后,通过admin上传的图片路径问题如何解决?

问题

  1. 使用 nginx 和 uwsgi 部署 django 项目,能够正常访问各个页面

  2. 目标功能是进入 admin 页面上传图片,即时显示在首页上

  3. 目前通过 admin 上传图片后,图片会存放在 django 项目的 static/media/upload 目录下,ng 的静态文件目录下没有

  4. 由于设置了 nginx,所以现在首页无法显示图片,因为图片在 /var/www/static/projectName 目录下没有

  5. 网上找到一种 将图片目录重定向到 nginx 的的静态文件目录 的方案,可惜没有解决

  6. 这里请教一下各位老哥,应该如何配置可以实现在 admin 中上传图片后,可以直接存在 /var/www/static/projectName 目录下(也就是 ng 的静态文件目录)

非常感谢,希望大家能不吝吐槽和赐教!!!

代码

1. 以下是 ng 的配置文件:

upstream django {
    server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}
server {
    listen      80;
    charset     utf-8;
    client_max_body_size 75M; 
location /media  {
    alias /var/www/NickBlog/static;
}

location /static {
    alias /var/www/NickBlog/static;
}

location / {
    uwsgi_pass  django;
    include     uwsgi_params; 
}

}

2. uwsgi 的配置文件

[uwsgi]
# Django-related settings
socket = :8000
# the base directory (full path)
chdir = /root/NickBlog/
wsgi-file = /NickBlog/wsgi.py
# Django s wsgi file
module =NickBlog.wsgi
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 4
# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum = true
pidfile=uwsgi.pid
daemonize=uswgi.log

3. django settings 文件部分配置

STATIC_URL = '/static/'
STATIC_ROOT = '/var/www/NickBlog/static/'

公共的 static 文件

STATICFILES_DIRS = ( os.path.join(BASE_DIR, “static”), os.path.join(BASE_DIR, “static/media”), )

upload floder

MEDIA_URL = ‘/static/media/’ MEDIA_ROOT = os.path.join(BASE_DIR, ‘static/media’)

STATICFILES_FINDERS = (“django.contrib.staticfiles.finders.FileSystemFinder”, “django.contrib.staticfiles.finders.AppDirectoriesFinder”,)


Python中Django项目部署后,通过admin上传的图片路径问题如何解决?

7 回复

<br># Django media<br> location /media {<br> alias /var/www/NickBlog/static/media; # your Django project's media files - amend as required<br> }<br><br><br>
改为这样试试


在Django项目部署后,通过admin上传的图片路径问题,核心在于正确配置MEDIA_URLMEDIA_ROOT,并确保生产环境服务器(如Nginx或Apache)能够正确提供媒体文件服务。

1. 基础配置 在你的settings.py文件中,需要正确定义媒体文件的设置:

# settings.py
import os

# 项目根目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# 媒体文件配置
MEDIA_URL = '/media/'  # 浏览器访问媒体文件的URL前缀
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')  # 媒体文件在服务器上的存储路径

2. 开发环境配置 在开发时,需要在urls.py中添加静态文件服务配置:

# urls.py
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    # ... 其他URL配置
]

# 仅在开发环境(DEBUG=True)时添加媒体文件服务
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

3. 生产环境配置 在生产环境(DEBUG=False)中,Django不提供静态文件服务,需要通过Web服务器(如Nginx)来提供媒体文件:

Nginx配置示例:

server {
    listen 80;
    server_name yourdomain.com;
    
    location /static/ {
        alias /path/to/your/project/static/;
    }
    
    location /media/ {
        alias /path/to/your/project/media/;
    }
    
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

4. 模型定义示例 确保你的模型正确使用FileFieldImageField

# models.py
from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=100)
    image = models.ImageField(upload_to='products/')  # 图片将存储在media/products/目录下
    
    def __str__(self):
        return self.name

5. 模板中正确引用 在模板中引用上传的图片时,使用正确的URL:

<!-- 模板文件 -->
<img src="{{ object.image.url }}" alt="{{ object.name }}">

关键点总结:

  • 开发环境:使用Django的static()函数提供媒体文件
  • 生产环境:配置Web服务器(Nginx/Apache)来提供/media/路径下的文件
  • 确保MEDIA_ROOT目录存在且有正确的写入权限
  • 上传的文件会自动保存到MEDIA_ROOT/upload_to/路径下

一句话建议: 正确区分开发和生产环境的媒体文件服务配置是关键。

为什么不直接把图片上传到 CDN 上面呢




正在研究诸位给的答案,非常感谢!!!

MEDIA_ROOT 直接改成 nginx 配置的目录,给 web 进程读写权限,就直接存进去了。

后来我尝试这个方法,成功了!非常感谢大佬!

回到顶部