【问题标题】:How does Django serve media files?Django 如何提供媒体文件?
【发布时间】:2010-09-29 00:08:17
【问题描述】:

我设置了一个使用图像的Django 应用程序。我想我已经正确设置了媒体设置 MEDIA_ROOT 和 MEDIA_URL。但是图像不显示。你知道可能是什么问题吗?

让我们考虑这个例子:

图像文件位于 /home/www/media/app/photos 下,我们正在尝试请求http://example.com/photos/123.jpg

我应该使用这些设置吗?

MEDIA\_ROOT = /home/www/media

MEDIA_URL = http://example.com/app

更新:忘了说我使用的是内置开发服务器。

【问题讨论】:

    标签: django file static


    【解决方案1】:

    您可以将这些行添加到您的 urls.py

    from django.urls import re_path
    from django.views.static import serve
    
    urlpatterns = [
        ...
        re_path(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}), 
        ]
    

    【讨论】:

      【解决方案2】:

      这是使用 ImageField 显示图像文件的正确方法。假设我们有一张用户头像:

      models.py:

      UserProfile:
          profilePic= models.ImageField( upload_to='PATH_TO_UPLOAD', blank=True, null=True)
      

      settings.py:

      MEDIA_ROOT = 'FULL_PATH_OF_MEDIA'
      MEDIA_URL = 'URL_OF_MEDIA'
      

      urls.py:

      urlpatterns = [
      .
      .
      .
      ]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
      

      PATH_TO_UPLOAD 是用户上传数据的路径。这是FULL_PATH_OF_MEDIA的子目录,表示上传的文件会有

      FULL_PATH_OF_MEDIA/PATH_TO_UPLOAD 
      

      完整路径。现在可以通过此网址访问此内容:

      SITE_NAME/URL_OF_MEDIA/PATH_TO_UPLOAD
      

      我也推荐在static_files vs media_files阅读这篇文章

      doc

      【讨论】:

      • 请记住,这只有在 DEBUG = True 时才有效
      【解决方案3】:

      我知道最初的问题是关于开发服务器的,但对于正在寻找生产环境答案的其他人来说:

      https://docs.djangoproject.com/en/1.8/howto/static-files/deployment/ 提供了有关如何让 django 在生产环境中提供文件的指南。从指南的语气来看,它似乎暗示最好有一个单独的 Web 服务器来处理文件或将 mod_wsgi 与 Apache 一起使用

      【讨论】:

        【解决方案4】:

        仅用于开发

        您可以通过在urls.py 文件中执行此操作来设置静态媒体服务器以与他们的开发服务器一起使用。我附上了显示我如何使用它的代码(以及强制调试条件。)

        from django.conf import settings
        from django.conf.urls.defaults import *      
        
        # Uncomment the next two lines to enable the admin:
        from django.contrib import admin
        admin.autodiscover()
        
        urlpatterns = patterns('', 
            (r'^$', 'views.index'),            
        
            # Accounts
            (r'^accounts/login/$', 'views.user_login'),
            (r'^accounts/logout/$', 'views.user_logout'),
        
            # Contrib Modules
            (r'^admin/(.*)', admin.site.root),
        )
        
        if settings.DEBUG :
            urlpatterns += patterns('',
                (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
            )
        

        我将我的MEDIA_ROOT 放在 html/media 的子目录中,并在settings.py 中链接到它

        MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'html/media/').replace('\\','/')
        

        开发完成后,项目将部署到 Web 服务器,然后由 Apache 使用指令提供静态媒体文件。

        【讨论】:

        • 在您的模板中,您将如何引用 CSS 文件或图像文件?假设你的 CSS 位于 html/media/styles.css。
        【解决方案5】:

        我怀疑您正在获取 Django 404 页面。尝试直接访问您的一张图片,看看是否发生这种情况。

        如果是这样,您需要将 Web 服务器配置为将媒体层次结构中的请求发送到 Django,而是直接为它们提供服务。这是我的 Apache conf 文件中的一个片段。第一部分告诉 Apache 将所有内容发送给 Django。第二部分有“SetHandler None”,它表示“以正常方式处理 /media 下的内容。”

        查看http://docs.djangoproject.com/en/dev/howto/deployment/modpython/了解所有激动人心的细节。

        PrinceOfPinot.com(AKA pop)的部分 httpd.conf 文件:

        <Location "/">
            SetHandler python-program
            PythonAutoReload Off
            PythonDebug Off
            PythonPath "['/var/www/production/pop', '/usr/local/lib/python2.5/site-packages/django'] + sys.path"
            SetEnv DJANGO_SETTINGS_MODULE settings
            PythonHandler django.core.handlers.modpython
        </Location>
        
        <Location "/media">
            SetHandler None
            AddOutputFilterByType DEFLATE text/html text/css application/x-javascript
        </Location>
        

        【讨论】:

          【解决方案6】:

          开发人员自己不鼓励从 Django 提供静态内容(如果我没记错的话,它只在调试模式下有效)。您应该改用专用的网络服务器。

          无论如何,如果您确实需要这样做,请阅读how to serve static files 上的文档。

          【讨论】:

            猜你喜欢
            • 2010-11-08
            • 1970-01-01
            • 1970-01-01
            • 2021-11-06
            • 1970-01-01
            • 2018-11-07
            • 1970-01-01
            • 1970-01-01
            • 2021-03-02
            相关资源
            最近更新 更多