【问题标题】:Django: understanding how to serve static files during development -- NOOB editionDjango:了解如何在开发过程中提供静态文件——NOOB 版
【发布时间】:2017-08-16 10:57:38
【问题描述】:

我正在努力让我的静态文件正常工作。在开始发布文档链接之前,我已经阅读并尽我所能了解以下链接:

- https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.FileField

我会说我认为其中的第二个非常令人困惑。

简而言之,我使用文档解决问题的尝试均未成功。所以我会很感激有人带我了解正在发生的事情。

首先,我有一个应用程序,my_app。在my_app 我有一个模型,它的图像字段如下所示:

def my_app_dir_path(instance, filename):
    return 'my_app/static/my_app/images/other_{0}/{1}'.format(instance.other.id, filename)


MyModel(models.Model):
    other = models.ForeginKey("other", on_delete=models.CASCADE)
    image = models.ImageField(upload_to=my_app_dir_path)

简而言之,我上传的文件会转到命名空间的本地静态目录:

 /my_app/static/my_app/images/other_<id>/<image_file>

正如它所说,我应该在 (4) 中为链接如何配置静态文件配置静态文件。

太好了。

我有一个虚拟视图,我正在使用它来尝试查看是否可以加载我的图像:

#/my_app/views.py
def dummy(request):
    img = MyModel.objects.first()
    return render(request, 'my_app/dummy.html', {'img':img})

基本上就是这样

#dummy.html
<img src="{{ img.image.url }}" />

查看网站检查器,我们看到返回的 url 是:

my_app/static/my_app/images/other_<id>/<image_file>

如果 - 在检查器中 - 我将该 url 更改为

static/my_app/images/other_<id>/<image_file>

图像出现!

那么我如何获得 - 用于开发 - 正确的 url?

当我们在做的时候:

  • 这个约定是什么? ('/var/www/static/')
  • 我应该将+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 添加到我的urlpattern 中的my_app 还是根目录中?还是两者兼有?
  • 媒体和静态之间有什么区别。图像文件(除非您使用动态 svg)不被视为静态文件吗?
  • 为什么我必须在全局根静态/媒体文件夹中编译所有内容(这难道不符合模块化的意义吗?)

简而言之,有人可以教我如何为开发提供静态图像吗? 我真的很困惑。

【问题讨论】:

  • 您将 MEDIA 文件(由用户在应用程序运行时上传,未检入版本控制)与静态文件(与应用程序一起部署,通常检入版本控制)混淆了。您没有显示任何设置(例如MEDIA_URLMEDIA_ROOT),这使得提供帮助变得更加困难。你的标题说的是部署,但你的问题是开发,所以不清楚你在哪里遇到了麻烦。看起来 this section 就是您要查找的内容。
  • @Alasdair 是的,对不起,我的意思是标题中的发展(现已更正)。然而,媒体的东西是当你开始一个新项目的时候。没摸过。我不知道它是什么或它做什么或为什么它与静态不同。我已经看过那部分,并尝试了该解决方案,但它确实有效
  • 如果你没有设置MEDIA_URL(例如MEDIA_ROOT = '/media/')或MEDIA_ROOT(例如MEDIA_ROOT = '/path/to/where/you/want/to/store/uploaded/files/'),它将无法工作。
  • @Alasdair 媒体 url 和媒体根有什么区别,当我的图片是静态的并由管理员上传时,为什么我必须设置它们
  • 正如我之前所说,Django 将用户上传的文件(无论他们是否使用管理员)视为媒体文件,而不是静态文件。文档解释了 MEDIA_ROOTMEDIA_URL 的用途。

标签: python django python-3.x static


【解决方案1】:

Django 的术语并不完美。 “静态”和“媒体”文件都是静态的(在生产中,两者都应该由 Web 服务器提供服务,而不涉及 Django)。此外,“媒体”文件可以是任何类型的文件,而不仅仅是媒体。更好的术语可能是“应用程序文件”和“数据文件”。

静态文件”是永久的;它们是您应用程序的一部分。这些通常是 JavaScript、CSS 和图像,例如徽标和图标。

媒体文件”是应用程序数据。在某种程度上,它们是数据库的一部分,但 Django 更喜欢将它们存储在数据库之外。通常这些文件对应于ImageFieldFileField

开发中,Django 自动提供静态文件。您需要的唯一配置是STATIC_URL = '/static/'。如果您有文件my_app/static/my_app/js/myjsfile.js,Django 将在http://localhost:8000/static/my_app/js/myjsfile.js 提供该文件(URL 中的/static/ 实际上由STATIC_URL 指定)。在模板中,您通常使用&lt;script src="{% static 'my_app/js/myjsfile.js' %}"&gt; 之类的东西,Django 会将其转换为&lt;script src="/static/my_app/js/myjsfile.js"&gt;,但即使您决定更改STATIC_URL,它也会正常工作。除了设置STATIC_URL 和设置DEBUG = True 之外,您通常不需要进行任何配置。

对于媒体文件,您需要同时指定MEDIA_ROOTMEDIA_URL。第一个是实际存储“媒体”文件的目录,MEDIA_URL 是媒体 URL,如MEDIA_URL = '/media/'。这意味着http://localhost:8000/media/xxx 指向一个媒体文件。您还需要在这里DEBUG = True

生产中,事情更加复杂。我已经制作了a graphic 来解释它。

【讨论】:

  • 这有助于澄清很多事情。为什么新应用会自动设置STATIC_URL 而不是MEDIA_URL?无论如何,假设我将 ImageField 上传到/media/&lt;app&gt;/&lt;sub-dir(s)&gt;/&lt;image-file&gt;,我还设置了MEDIA_URLMEDIA_ROOT,以及如何在模板中获取网址?
  • 好的,所以我得到了图像!但我不明白为什么。我正在我的本地系统上开发。所以我设置了MEDIA_ROOT="&lt;path-to-project-dir&gt;/media/"MEDIA_URL="/media/",然后将+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 添加到我的应用程序中的urlpatterns。为什么这必须在应用程序下?
猜你喜欢
  • 2012-03-25
  • 2012-06-04
  • 2014-03-13
  • 2020-02-13
  • 2012-01-26
  • 2013-12-22
  • 2015-08-06
  • 1970-01-01
  • 2012-03-01
相关资源
最近更新 更多