Python中Django项目部署后,通过admin上传的图片路径问题如何解决?
问题
-
使用 nginx 和 uwsgi 部署 django 项目,能够正常访问各个页面
-
目标功能是进入 admin 页面上传图片,即时显示在首页上
-
目前通过 admin 上传图片后,图片会存放在 django 项目的 static/media/upload 目录下,ng 的静态文件目录下没有
-
由于设置了 nginx,所以现在首页无法显示图片,因为图片在 /var/www/static/projectName 目录下没有
-
网上找到一种 将图片目录重定向到 nginx 的的静态文件目录 的方案,可惜没有解决
-
这里请教一下各位老哥,应该如何配置可以实现在 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上传的图片路径问题如何解决?
<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_URL和MEDIA_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. 模型定义示例
确保你的模型正确使用FileField或ImageField:
# 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 上面呢
你需要 FilePathField,see -> https://docs.djangoproject.com/en/2.0/_modules/django/forms/fields#FilePathField
正在研究诸位给的答案,非常感谢!!!
MEDIA_ROOT 直接改成 nginx 配置的目录,给 web 进程读写权限,就直接存进去了。
后来我尝试这个方法,成功了!非常感谢大佬!

